Educational Codeforces Round 159 (Rated for Div. 2)(B 二分贪心 Cgcd D二分+前缀和 E字典树)

news2024/9/26 1:28:25

A - Binary Imbalance

有只要在01之间插入就能制造无限个0,没有0就统计0 1个数即可

#include<bits/stdc++.h>
using namespace std;
const int N =1100+10,mod=998244353;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;
using node=tuple<int,int,int>;
int n,m,k;
int s[N][N];
char p[N][N];
void solve()
{cin>>n;
    string s;cin>>s;
    int cnt0=0;
    bool ok=false;
    for(int i=0;i<s.size();i++){
        if(s[i]=='0') cnt0++;
        else cnt0--;
        if(i!=0&&s[i-1]!=s[i]) ok=true;
    }
    if(ok||cnt0>0){
        cout<<"Yes\n";
    }
    else cout<<"No\n";
}

signed main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t=1;
    cin>>t;
    while(t--) solve();
}

B - Getting Points

具有单调性,n也挺大,我直接二分可以休息多少天了

然后直接算n天一共有多少个任务,然后有个特殊情况是

如果我最后一天刚好是发布任务的那天且今天是周一

那么我当前的任务只能让最后一个做

前面能做的任务要减1,能解决的总任务是2*x-1

#include<bits/stdc++.h>
using namespace std;
const int N =2e5+10,mod=998244353;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;
using node=tuple<int,int,int>;
int n,m,k;
void solve()
{
    int p,l,t;
    cin>>n>>p>>l>>t;
    auto check=[&](int x)
    {
        x=n-x;
        int now=(n+6)/7;
        int res=l*x+min(now,x*2)*t;
        if(n%7==1){
            res=l*x+min(now-1,x*2-1)*t+t;
        }
        return res>=p;
    };
    int ll=0,r=n;
    while(ll<r){
        int mid=ll+r+1>>1;
        if(check(mid)) ll=mid;
        else r=mid-1;
    }
    cout<<ll<<"\n";
}

signed main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t=1;
    cin>>t;
    while(t--) solve();
}

C:

我直接一眼直觉得出结论了ahhh(虽然不知道这想法哪来的,反正就很直觉)

赛后证明一下

每个数要变成一个统一的数字 x

那么第一个数要是 a+kw=x ->> x-a=kw

第二个数是 b+kw=x -> x-b=kw

....

因为只能数只能增大不能减少,所以我们直接让x为最大值即可

然后求最大值和每个数的差值的最大公因数即可

然后增加一个数,肯定也要上最大值加上这个gcd了

然后我是直接枚举两种情况的

比最大值大,和比最大值小的

循环n+1次肯定都能找到,然后计算代价即可

#include<bits/stdc++.h>
using namespace std;
const int N =2e5+10,mod=998244353;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;

int n,m,k;
int a[N];
int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    if(n==1){
        cout<<1<<"\n";return ;
    }
    sort(a+1,a+1+n);
    vector<int> b;
    for(int i=1;i<n;i++){
        b.push_back(a[n]-a[i]);
    }
    int g=b[0];
    for(auto x:b) g=gcd(g,x);
    int res=0;
    for(auto x:b){
        res+=x/g;
    }
    map<int,int> mp;
    for(int i=1;i<=n;i++){
        mp[a[i]]++;
    }
    int mn=2e18;
    int cnt=n;
    for(int i=0,now=a[n];i<=n;i++){
        now+=g;
        if(!mp.count(now)){
            mn=min(mn,n*(now-a[n])/g);
            break;
        }
    }
    for(int i=0,now=a[n];i<=n;i++){
        now-=g;
        if(!mp.count(now)){
            mn=min(mn,abs(now-a[n])/g);
            break;
        }
    }
    cout<<res+mn<<"\n";
}

signed main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t=1;
    cin>>t;
    while(t--) solve();
}

D - Robot Queries

手画一下可以发现,中间那段翻转不影响最终结果

然后还是做不了发现

然后我们要进行转化一下

转化成前缀和,把区间问题变成选择两个点后到达的点是xi,yi

对于不是反转的区间 [1,L-1]和[R-1,N]这两个区间,直接从里面找即可

对于反转的我们其实也可以直接找

比如要找的点是 xi,y1

那么还原回来

pre[L-1]+pre[R]-pre[x-1]=xi

pre[x-1]=pre[L-1]+pre[R]-xi

注意这里的pre[R]-pre[x-1]是代表着翻转的区间的变化量

#include<bits/stdc++.h>
using namespace std;
const int N =2e5+10,mod=998244353;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;
using node=tuple<int,int,int>;
int n,m,k;
int a[N];
const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};
map<char,int>dir={{'U',2},{'D',3},{'L',1},{'R',0}};
void solve()
{
    cin>>n>>m;
    string s;
    cin>>s;
    vector<PII> pre(n+10);
    pre[0]={0,0};
    s="?"+s;
    for(int i=1;i<=n;i++){
        int k=dir[s[i]];
        auto [x,y]=pre[i-1];
        x+=dx[k],y+=dy[k];
        pre[i]={x,y};
    }
    vector<set<PII>> v(6*n+10);
    for(int i=0;i<=n;i++){
        auto [x,y]=pre[i];
        v[x+3*n].insert({y,i});
    }
    for(int i=0;i<=4*n;i++){
        v[i].insert({inf,inf});
    }
    while(m--){
        int tx,ty,L,R;
        cin>>tx>>ty>>L>>R;
        int px,py;

        px=tx,py=ty;
        auto [y1,id1]=*v[px+3*n].lower_bound({py,0});
        if(y1==py&&id1<=L-1){
            cout<<"YES\n";
            continue;
        }

        //[L,R]
        auto [adx,ady]=pre[L-1];
        auto [bdx,bdy]=pre[R];
        px=bdx+adx-tx,py=bdy+ady-ty;
        //cout<<px<<' '<<py<<'\n';
        auto [y2,id2]=*v[px+3*n].lower_bound({py,L-1});
        if(y2==py&&id2>=L-1&&id2<=R){
            cout<<"YES\n";
            continue;
        }

        //[R+1,n]
        px=tx,py=ty;
        auto [y3,id3]=*v[px+3*n].lower_bound({py,R+1});
        if(y3==py&&id3>=R+1&&id3<=n){
            cout<<"YES\n";
            continue;
        }
        cout<<"NO\n";
    }
}

signed main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t=1;
   // cin>>t;
    while(t--) solve();
}

E - Collapsing Strings

这个题之前我博客遇到过相似的题

然后也直接一眼题...

直接跑个字典树,然后翻转字符串减去要减去的贡献即可

我的query里面你可以

第一个点是p,第二个点的cnt[p]是3

然后要减去的代价是两个点之间消失的个数*当前点的长度-1

3-2就代表着我从第二个点到第三个点少了一个可以匹配的字符串

说明这一个字符串只能匹配到长度2的前缀他就没了

然后还有个问题是如果匹配完了我的lst不为0

说明有lst个字符串能完整匹配完

#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10,mod=998244353;

typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;
using node=tuple<int,int,int>;
int n,m,k;
int a[N];
int tr[N][27];
string s[N];
int cnt[N],idx;
long long res;
void insert(string s){
    int p=0;
    for(int i=0;i<s.size();i++){
        int u=s[i]-'a';
        if(!tr[p][u]) tr[p][u]=++idx;
        p=tr[p][u];
        cnt[p]++;
    }
}
void query(string s){
    int n=s.size();
    int len=0;
    int p=0,lst=-1;
    for(int i=0;i<s.size();i++)
    {
        int u=s[i]-'a';
          len++;
        if(!tr[p][u]){
            if(lst){
                res-=1ll*lst*2*(len-1);
            }
            return ;
        }
        p=tr[p][u];
        if(lst==-1){
            lst=cnt[p];
            continue;
        }
        res-=1ll*(lst-cnt[p])*2*(len-1);
        lst=cnt[p];
    }
    if(lst){
        res-=1ll*lst*2*len;
    }

}
void solve()
{
    cin>>n;
 
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        cin>>s[i];
        insert(s[i]);
        sum+=s[i].size();
    }

    for(int i=1;i<=n;i++){
        res+=sum+1ll*(int)(s[i].size())*n;
        reverse(s[i].begin(),s[i].end());
        query(s[i]);
    }
    cout<<res<<"\n";
}

signed main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t=1;
   // cin>>t;
    while(t--) solve();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1284666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java学习part34collect和map

153-集合框架-数组的特点、弊端与集合框架体系介绍_哔哩哔哩_bilibili 1.以前的数组 2.常用 3.Collection add只能加object&#xff0c;如果有基本类型会装箱 3.2集合和数组转换 3.3往集合添加对象的注意事项 4.迭代器 容易越界 一般不用 常用好用 5.for each 类似c的for( …

vue3 vue-router编程式导航(二)

文章目录 一、跳转到指定路径1. query传参2. Params传参 二、前进/后退三、替换当前页 Vue Router提供了强大且灵活的编程式导航功能&#xff0c;能够通过代码来控制路由的切换和跳转。本篇博客将介绍如何在Vue 3应用程序中使用Vue Router进行编程式导航。 一、跳转到指定路径…

Proteus仿真--基于51单片机的DS18B20温度采集及报警

本文介绍基于DS18B20温度采集及报警的仿真设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中温度传感器选用DS18B20器件&#xff0c;主要用于获取温度数据并上传&#xff0c;温度显示选用数码管&#xff0c;报警模块选用蜂鸣器 仿真运行视频 Pr…

pip命令详解

pip命令介绍 pip是由Ian Bicking在2008年提出的&#xff0c;他将pyinstall重命名为pip。名称pip是首字母缩写词&#xff0c;全称为“Package Installer for Python”。自Python3的3.4版本以及Python2的2.7.9版本开始&#xff0c;pip被直接包括在Python的安装包内&#xff0c;成…

SpringBoot系列之使用Redis ZSet实现排序分页

软件环境&#xff1a; JDK 1.8 SpringBoot 2.2.1 Maven 3.2 Mysql 8.0.26 spring-boot-starter-data-redis 2.2.1 jedis3.1.0 开发工具 IntelliJ IDEA smartGit 实现思路 相对于set来说&#xff0c;sorted set是一种有序的set&#xff0c;排序是根据每个元素的score…

云原生之深入解析如何限制Kubernetes集群中文件描述符与线程数量

一、背景 linux 中为了防止进程恶意使用资源&#xff0c;系统使用 ulimit 来限制进程的资源使用情况&#xff08;包括文件描述符&#xff0c;线程数&#xff0c;内存大小等&#xff09;。同样地在容器化场景中&#xff0c;需要限制其系统资源的使用量。ulimit: docker 默认支持…

【Vue】使用 Vue CLI 脚手架创建 Vue 项目(使用命令行创建)

前言 在开始使用Vue进行开发之前&#xff0c;我们需要先创建一个Vue项目。Vue CLI&#xff08;Command Line Interface&#xff09;是一个官方提供的脚手架工具&#xff0c;可以帮助我们快速创建Vue项目。 步骤 打开终端或命令行工具&#xff0c;运行以下命令&#xff1a; vu…

传输层可靠传输的原理

目录 1.停止等待协议 2.连续ARQ协议 3.TCP报文段的首部格式 4.TCP的滑动窗口机制 &#xff08;1&#xff09;发送窗口 &#xff08;2&#xff09;接收窗口 &#xff08;3&#xff09;发送缓存 5.超时重传时间的选择 6.选择确认SACK(Selective ACK) 7.使用滑动窗口实现…

TCL - 库编译过程和官方手册

文章目录 TCL - 库编译过程和官方手册概述笔记编译步骤TCL官方手册END TCL - 库编译过程和官方手册 概述 想看看sqlite3的官方demo工程, 没看到. 想编译一下sqlite3源码, 看看编译后有没有example 工程. 看了sqlite3的官方说明, 他们工程使用tcl来编译的. 一听tcl, 咋这么耳熟…

基于Docker构建Python开发环境

1. Dockerfile dockerfile所在目录结构 FROM python:3.8 WORKDIR /leo RUN apt-get install -y wget RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai >/etc/timezone # ssh免密登录 COPY id_rsa.pub /leo RUN mkdir ~/.s…

戴森发布全新Airstrait吹风直发器,美发科技品类再添力作

——利用气流&#xff0c;吹干的同时拉直头发&#xff0c;无需热夹板&#xff0c;头发无热损伤 &#xff08;2023年11月30日&#xff0c;上海&#xff09;戴森今日重磅发布全新美发造型产品——戴森Airstrait™吹风直发器&#xff0c;作为戴森美发科技品类的又一创新力作&…

Redis Hash数据类型

Redis Hash数据类型 几乎所有的主流编程语言都提供了哈希(hash)类型&#xff0c;它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中&#xff0c;哈希类型是指值本身又是一个键值对结构&#xff0c;形如key “key”&#xff0c;value {ffield1, value1 }, … {fieldN…

算法通关村第十六关-黄金挑战滑动窗口与堆的结合

大家好我是苏麟 , 今天带来一道小题 . 滑动窗口最大值 描述 : 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 题目 : …

探索图像生成中的生成对抗网络 (GAN) 世界

一、介绍 生成对抗网络&#xff08;GAN&#xff09;的出现标志着人工智能领域的一个重要里程碑&#xff0c;特别是在图像生成领域。GAN 由 Ian Goodfellow 和他的同事于 2014 年提出&#xff0c;代表了机器学习中的一种新颖方法&#xff0c;展示了生成高度逼真和多样化图像的能…

ping会出现的两种问题-----time out 和 unreachable

ping命令常见的返回信息有两种: Request timed out和Destination host unreachable 两者的区别是: Request timed out是ping包没有返回的路由&#xff0c;导致超时 Destination host unreachable是ping包没有去到目的地的路由 来看一个例子&#xff1a; 各部件配置如下&…

电子学会C/C++编程等级考试2022年09月(四级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:最长上升子序列 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … &l…

React全站框架Next.js使用入门

Next.js是一个基于React的服务器端渲染框架&#xff0c;它可以帮助我们快速构建React应用程序&#xff0c;并具有以下优势&#xff1a; 1. 支持服务器端渲染&#xff0c;提高页面渲染速度和SEO&#xff1b; 2. 自带webpack开发环境&#xff0c;实现即插即用的特性&#xff1b;…

新华三数字大赛复赛知识点 网络访问控制

EAD解决方案、portal认证、以太网访问控制列表 EAD&#xff1a; 网络安全从本质上讲是管理问题&#xff0c;&#xff08;End user Admission Domination&#xff09;解决方案从控制用户终端安全接入网络的角度入手&#xff0c;整合网络接入控制与终端安全产品&#xff0c;通过…

nginx对多个服务器的高可用,容易出现鉴权失败

高可用简单测试正常&#xff0c;但是出现高概率401鉴权错误 抓包发现&#xff0c;确实是401 &#xff0c; 而鉴权是两次交互&#xff1a; 抓包发现鉴权到不同服务器上了&#xff0c;导致鉴权没有完成。 此时就需要我们的ip_hash,把同一IP地址的请求,都分配给同一台后端服务器&…

【mysql】基于binlog数据恢复指令和坑

文章目录 1.binlog相关配置是否开启binlogbinlog日志格式 2.导出binlog日志mysqlbinlog指令updateinsertdeletebinlog中的事件 3.数据恢复4.特别注意的坑为什么bash脚本执行mysqlbinlog&#xff0c;无法找到指令为什么执行mysqlbinlog&#xff0c;无法数据恢复 1.binlog相关配置…