首页 > 其他分享 >牛客周赛 Round 72

牛客周赛 Round 72

时间:2024-12-22 12:08:43浏览次数:4  
标签:int tr len Round 牛客 72 ans push 节点

怎么全是01串

A

枚举除了末尾的字符,判断下一个是否与它不同,不同则对答案的贡献++

B

找一个连续子串是好串,如果我们找到长度为len的子串,那么从中任意截取一段均为好串

长度为len的子串 1个
长度为len-1的子串 2个
.....
长度为2的子串 len-1个

用等差数列公式
一个长度为len的好串子串的个数为\(\sum_{i=1}^{len-1}=\frac{len*(len-1)}{2}\)

C

构造一个解的情况还是很容易的,但是一些情况需要特判

以下情况都不能构成

  • \(k==0\) 此时有0有1则不可能构造
  • \(a==b && k>min(a,b)*2-1\) 此时的a个0和b个1,形成的01串最多有min(a,b)*2-1对不相邻的01,因为,长度为a+b的串最多有a+b-1对01,而此时a==b
  • \(a!=b && k>min(a,b)*2\) 假设此时b>a ,那么可以拿a个0和b个1构成上述的a*2-1对字符串,而此时1有多余的,还可以加入到字串末尾多形成一对01

可以构造的情况就简单了
先生成足够01,然后将多余的0,1放在两边

#include<bits/stdc++.h>
using namespace std;
int t;
int a,b,k;

int main(){
    cin>>t;
    while(t--){
        cin>>a>>b>>k;
        if(k==0){
            if(a && b){
                cout<<-1<<endl;
            }
            else {
                while(a){--a;cout<<"0";}
                while(b){--b,cout<<"1";}
                cout<<endl;
            }
        }
        else {
                if(a==b && k>min(a,b)*2-1) cout<<-1<<endl;
                else if(a!=b && k>min(a,b)*2){
                    cout<<"-1"<<endl;
                }
                else {
                    if(k&1){
                        int mid=k+1;
                        for(int i=1;i<=a-mid/2;++i) cout<<0;
                        for(int i=1;i<=mid/2;++i) cout<<"01";
                        for(int i=1;i<=b-mid/2;++i) cout<<1;
                    }
                    else {
                        int mid=k;
                        if(a>=b){
                            for(int i=1;i<=a-mid/2-1;++i) cout<<0;
                            for(int i=1;i<=mid/2;++i) cout<<"01";//只有k-1对01
                            for(int i=1;i<=b-mid/2;++i) cout<<1;
                            cout<<0;  //补上一个
                        }
                        else{
                            cout<<1;//前面补上
                            for(int i=1;i<=a-mid/2;++i) cout<<0;
                            for(int i=1;i<=mid/2;++i) cout<<"01";//只有k-1对
                            for(int i=1;i<=b-mid/2-1;++i) cout<<1;

                        }
                    }cout<<endl;
                }
                
        }
        
    }return 0;
}

D

一眼DP,但是状态转移时顺序错误了
应该从后往前转移

由题可知,只能转移最近相同字符和不同字符,

如果按照顺序来转移,举例00110,转移到第二个1时,最近的0是第一个1前一个,但因为0只能转移到最近的1,所以不能从这个0转移
这里的错误在于,忽略了01之间存在其他的有效转移,导致转移出错

如果按照逆序来转移,同样的例子,转移第一个1前面的0时,只能第一个1转移,末尾的0转移,这样逆转过来的顺序便不会出错
再深究一点,因为每一个位置,只有唯一的向后转移的顺序,所以反过来找时唯一的

#include<bits/stdc++.h>

using namespace std;

int n;
const int maxn=1e5+10;
int x,y;
int l1=-1,l0=-1;
string s;
long long  f[maxn];
int main(){
    cin>>n>>x>>y;
    cin>>s;
    for(int i=0;i<=n;++i) f[i]=1e15+10;
    f[n-1]=0;
    if(s[n-1]=='0') l0=0;
    else l1=0;
    for(int i=n-1;i>=0;--i){
        if(s[i]=='0'){
            if(l0!=-1)f[i]=min(f[i],f[l0]+x);
            if(l1!=-1)f[i]=min(f[i],f[l1]+y) ;   
            l0=i;
        }
        else{
            if(l0!=-1)f[i]=min(f[i],f[l0]+y);
            if(l1!=-1)f[i]=min(f[i],f[l1]+x);    
            l1=i;
        }
     
    }cout<<f[0]<<endl;
    return 0;
}

E

首先,不要误解题目,01串代表的正整数,不是二进制数
根据同余的性质,同乘性和同加性,一个数从高位乘到低位,余数不变

定义
\(

标签:int,tr,len,Round,牛客,72,ans,push,节点
From: https://www.cnblogs.com/guiyou/p/18620857

相关文章

  • LeetCode72. 编辑距离(2024冬季每日一题 37)
    给你两个单词word1和word2,请返回将word1转换成word2所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例1:输入:word1=“horse”,word2=“ros”输出:3解释:horse->rorse(将‘h’替换为‘r’)rorse->......
  • Codeforces Round 994 (Div. 2) (D-F)
    answerpage还有好多没补,但是既然赛时写出了e就应该去补f,不进则退这场没开排行榜埋头苦写第一次赛时出e了,也是第一次400名,可喜可贺//(虽然d不会)DE#include<bits/stdc++.h>usingnamespacestd;constintN=2e2+10;#definelowbit(x)(x&(-x))//#defineendl'\n'......
  • Codeforces Global Round 28
    1.A.KevinandCombinationLock知识点:模拟题目意思:现有一个正整数x,我们能否通过两个操作让x为0,可以就输出YES,不行就输出NO。操作一:如果x中存在33,并且x不等于33的情况下可以删除x中的33。比如13323->123。操作二:如果x>=33,可以让x=x-33。思路:操作一去除某个位置......
  • Codeforces Global Round 28 Editorial(A-F)
    连掉了五场分,但是该打还是要打。反正也不会更差了。problemset官方中解A我A就不会了,但是随便猜了一个结论过了。复制一下题解:考虑移除连续33实际减少的数是多少,就会发现减少的也是33倍数,所以原本就要整除才行B呃一开始构造错了。。把最小数间隔k排然后别的数随便塞C\(O(......
  • Codeforces Global Round 28 # D
    D.KevinandCompetitionMemories一、题意概述有n个选手和m个问题,给出每个选手的rating---a(n+1),和题目对应的rating---b(m+1),根据rating大小判断选手能否做出这一题。现在将所有题目分成[  ]组,求每组Kevin的排名,求其和,算出和的最小值;输出m个最小值,k分别等于1,2,···......
  • Codeforces Global Round 28 / cf contest 2048 题解
    比赛链接A.KevinandCombinationLock观察操作难度(个人感觉)★☆☆☆☆注意到两个操作都不改变\(\%33\)的值,因此要求原数\(\%33==0\),显然这是充分的。B.KevinandPermutation观察操作难度(个人感觉)★☆☆☆☆一个点的"势力范围"是以\([p,p+k)\)为右端点的......
  • Codeforces Global Round 28 : C. Kevin and Binary Strings O(n)解法
    题目地址https://codeforces.com/contest/2048/problem/C题意:给定一个字符串,字符串第一个是1,其他的都是0或1。问如何从该字符串中取两段,使得两段异或最大,两段可以重叠字符串的长度设为size因为字符串第一个是1,所以必定有一段是1sizeO(n)解法:第一段连续的0的长度设为cnt,第......
  • 「TOCO Round 1」 自适应 PVZ
    题意有\(n\)个豌豆射手,\(m\)个僵尸。对于第\(i\)个僵尸,如果任意一个豌豆射手在\(l_i\simr_i\)的时间里持续攻击它,僵尸\(i\)就会被杀死。每一个豌豆射手在同一时间只能攻击一个僵尸,求最少无法杀死多少僵尸。分析首先有一个很显然的贪心,就是优先攻击\(r\)较小的僵......
  • WPF StrokeStartLineCap Flat,Square,Round,Triangle
    <Windowx:Class="WpfApp74.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.......
  • SQL71 牛客每个人最近的登录日期(六)
    描述牛客每天有很多人登录,请你统计一下牛客每个用户查询刷题信息,包括:用户的名字,以及截止到某天,累计总共通过了多少题。 不存在没有登录却刷题的情况,但是存在登录了没刷题的情况,不会存在刷题表里面,有提交代码没有通过的情况,但是会记录在刷题表里,只不过通过数目是0。有一个登录(......