首页 > 其他分享 >练习记录-cf-div2-853-(A-C)

练习记录-cf-div2-853-(A-C)

时间:2023-02-26 01:33:07浏览次数:41  
标签:sz cnt gcd 853 int 记录 cf div2 数字

从11月打的只能写两题现在尽量3题了 就在这里慢慢记录下练习吧 看到成长也是学习的动力之一(补题会继续写,但不一定补的来

今日总结:还是只会写简单思维题的菜狗(今天居然是20开始,差点没赶上!

A题


题意:给出一堆数字,可以自由排序,对于大于等于2的前缀和子数组,要使gcd<=长度

我的解法:没看到排序,浪费了好多时间。比较暴力,求出每两个数的gcd,如果没有两个数的gcd<=2 那么条件不成立,相应的,如果有两个数<=2,再gcd一个数只可能更小

所以后续不需要考虑

我的slove函数代码如下 gcd可以使用__gcd吧

 int n;cin>>n;
    int a[200];
    int flag=1;
    int c;
    for(int i=1;i<=n;i++){
    cin>>a[i];
    }
    int mins=inf;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j) continue;
            mins=min(mins,gcd(a[i],a[j]));
        }
    }
    if(mins>2) flag=0;
    if(flag) cout<<"Yes\n";
    else cout<<"No\n";
View Code

 

 

B题

 


题意:你只能执行一次操作:选择一段区间,将内部数字全部取反(可以为0),操作后的字符串能否为回文;

我的解法:选择前后双指针扫一下,遇到不一样的记录,如果不一样的区间有两个以及以上,就是NO

slove函数如下,写的有点乱好像

    int n;cin>>n;
    string s;cin>>s;
    int L=0,R=n-1;
    int flag1=1,flag2=1;//flag1记录是否出现过不同,flag2记录不同区间是否结束 
    while(L<R){
        if(s[L]!=s[R]){
            if(flag1==1) flag1=0;
            else if(flag2==0) {//已经结束过一个区间
                printf("No\n");
                return;
            }
        }
        else if(flag1==0) flag2=0;//结束一个不同的区间
        L++;R--;
    }
    cout<<"Yes\n";
    return;
View Code

 

C题


其实c想了很久,都是n*m的复杂度,但是用屁股想都知道会被卡掉,都要放弃了 一看那么多人过了,还是静下心写吧。

题意:题目提供一个初始数组,无重复,接下来进行m次操作,输入整数a和b,把a位的数字替换成b,初始数组记为A0,后续每次操作记为A1~Am,

要求从A0~Am中每两个进行组合,拼成的新的数组中,不同数的数量的和(可以看样例解释理解)

我的解法:首先,我的计算方法是,从A1开始,每个往前遍历,求出该A的数量和,再求总和,这样显然超时。我发现,在最好的情况下,如果每对组合都是不同的数字(当然不可能),那么次数会是(1+2+3...+n-1)*2*n个,但是,有些两个Ai和Aj肯定会有重复数字,由于题目保证每个A都是内部无重复的,假设在所有的A中 1有k个, 那么,由于每个含有1的A往前求和的过程中,

1所造成的贡献就是1+2+...+n-1,这些全是等差数列,可以O(1)求出,而每次只会改一个数,我可以通过改的数字来求出这个数字的个数,比如,A0有1,A3中消除了1,那么cnt[1]增加2个

依次类推,最后,因为1<=a<=n+m,遍历范围每个数,然后减去贡献,就完成了 复杂度为O(sum(n+m))吧,反正不超

    int n,m;cin>>n>>m;
    map<int,int> sz,cnt;//sz记录数字出现的地方,cnt记录次数
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sz[a[i]]=1;
    }
    for(int i=2;i<m+2;i++){
        int x,y;cin>>x>>y;
        cnt[a[x]]+=i-sz[a[x]];
        sz[a[x]]=0;
        a[x]=y;
        sz[a[x]]=i;
    }
    for(int i=1;i<=n;i++) cnt[a[i]]+=m+2-sz[a[i]];
    //for(int i=1;i<=5;i++){
    //    cout<<i<<" : "<<cnt[i]<<"\n";
    //}
    ll ans=1LL*(1+m)*m*n;
    for(int i=1;i<=n+m;i++){
        if(cnt[i]==0||cnt[i]==1) continue;
        ans-=1LL*(cnt[i]-1)*cnt[i]/2;
    }
    cout<<ans<<"\n";
View Code

 

写出来3题还是很开心,尽管很弱,如果有大佬看到了,欢迎批评指正,新手上路罢了。后面补了再更新笔记

标签:sz,cnt,gcd,853,int,记录,cf,div2,数字
From: https://www.cnblogs.com/xishuiw/p/17155827.html

相关文章

  • CF580D Kefa and Dishes
    有n个菜(0<n<=18)第i个菜的满意度为a[i](0<=ai<=10^9),有k个规则,如果在吃完第xi个菜之后吃了第yi个菜,会额外获得ci的满意度。kefa要吃m道任意的菜(0<m<=n),但是他希望自己吃菜的......
  • 适用于初学者的CF1654E Arithmetic Operations题解
    题目让我们求改变数字的最少次数,那我们转化一下,求可以保留最多的数字个数\(cnt\),再用\(n\)减一下就行,即\(res=n-cnt\)。我们先考虑两种暴力方法。第一种暴力方......
  • MusicFree 开源音乐软件
    软件名称:MusicFree丨版本:v0.1.0-alpha.2丨平台:安卓软件介绍:猫头猫开发的开源音乐软件,通过添加插件的方式,可以播放多个平台的音频内容,免费无广告,作为一款新上线的软件,......
  • CF717A Festival Organization 题解
    传送门首先考虑求出长度为\(i\)的合法串的个数。很明显可以想到用dp解。设\(f_{i,0/1}\)为长度为\(i\)最后一位为\(0/1\)的合法串个数。可以很容易想到转移......
  • CF1383E 题解
    题意传送门给定一个长度为\(n\)的01串\(a\)。在一次操作中,你可以选择任意一个\(i\in[1,|a|)\),令\(a_i=\max(a_i,a_{i+1})\),然后将\(a_{i+1}\)删除。你可以进行......
  • CF1738E Balance Addicts
    个人思路:\(sum_i\)表示前\(i\)个数的前缀和,推一下式子可知是要选若干对\(l_i,r_i\),使得\(l_1<l_2<\dots<l_k\ler_k<\dots<r_2<r_1\)且\(sum_{l_i}+......
  • CF837D题解
    CF837D题解没有用的话今天晚上在CF题库里随便选题选的,感觉还不错的题。昨天就开始停自习了,但是一直在摆烂(悲,自从上个学期就这样了,非常怀念一年前的机房,风清气正,大家都......
  • CF607B zuma
    从序列中每次消去回文串,问最少几次消除完 #include<iostream>#include<cstring>usingnamespacestd;constintN=503,inf=0x3f3f3f3f;intf[N][N],a[N],n;......
  • 【五期邹昱夫】CCF-A(SIGSAC'22)Membership Inference Attacks by Exploiting Loss Traj
    "Liu,Yiyong,etal."Membershipinferenceattacksbyexploitinglosstrajectory."Proceedingsofthe2022ACMSIGSACConferenceonComputerandCommunicatio......
  • CF1744F MEX vs MED
    个人思路:条件可以转化成长度为\(x\)的区间需要包含\([0,\lfloor\frac{(x-1)}{2}\rfloor]\)。我们从小到大枚举每一个数\(i\),计算长度为\(i\times2+1\)和\(i......