首页 > 其他分享 >Educational Codeforces Round 162 [Rated for Div. 2]

Educational Codeforces Round 162 [Rated for Div. 2]

时间:2024-02-24 12:11:45浏览次数:25  
标签:Educational Rated int ll Codeforces 次数 num maxn dis

第二次,三道题,剩下的回学校再补,总结:还是需要多练习

A:让数列里所有的1都挨在一起,可以看出,相邻 1 之间有多少个 0 就需要操作几次,特判:当只有一个 1 或者原本全是 1 就输出 0;

void solve(){
    cin>>n;
    int top1=0,top2=0,cnt=0;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    for(int i=1;i<=n;i++){
        cin>>x;
        if(x==0) a[++top1]=i;//记录0的位置 
        if(x==1) b[++top2]=i;//记录1的位置 
    }
    if(top1==0 || top2==1){
        cout<<"0"<<"\n";
        return ;
    } 
    for(int i=2;i<=top2;i++){
        if(b[i]-b[i-1]>1){
            cnt+=(b[i]-b[i-1]-1);
        }
    }
    cout<<cnt<<"\n";
}

B:贪心,先射击离自己最近的怪物,处理负数坐标:先按照绝对值排序,然后把负坐标的距离利用abs变成正的

ll t,n,k;
struct node{
    ll life,dis;
}a[maxn]; 
bool cmp(node aa,node bb){
    return abs(aa.dis)<abs(bb.dis);
}
void solve(){
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i].life;
    for(int i=1;i<=n;i++) cin>>a[i].dis;
    sort(a+1,a+1+n,cmp);
    ll m=0;
    for(int i=1;i<=n;i++){
        m+=a[i].life;
        a[i].dis=abs(a[i].dis);
        if(m>k*a[i].dis){
            cout<<"NO"<<endl;
            return ;
        }
    }
    cout<<"YES"<<endl;
}

C:由题意可以分析,数列元素都要大于 0 ,所以如果数列中的元素等于 1 ,那么肯定不能减 1,只能加 1 ,例如 1 1 2,可以变成 1 2 1 ,2 1 1 ,虽然和相同,但元素依然没变,所以是违法的。

由此可以得出,如果所有 1 的数量大于所有非  1 的数字可以减到 1 的次数总和,那么就是非法的,如果所有 1 的数量小于所有非 1 的数字可以减到 1 的次数的总和,那么就是合法的

例如 1 1 1 3 是非法的,因为所有 1 只能 加 1 ,3减到 1 只能减两次,

1 1 1 4 是合法的,操作之后是 2 2 2 1

用前缀和数组 num 记录数列中 1 的个数 ,数组 b 记录非 1 减到 1 的次数总和

ll a[maxn],b[maxn],num[maxn];
void solve(){
    ll n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        a[i]--; // 减1表示最大的变化次数 
        num[i]=num[i-1]+(a[i]==0);//1看作1,非1看作0 
        b[i]=b[i-1]+a[i]; //每个数字的最大变化次数 
    }
    while(k--){
        int l,r;
        cin>>l>>r;
        ll x=num[r]-num[l-1]; //1的数量 
        ll sum=b[r]-b[l-1]; // 非1的数字最大变化次数 
        if(x>sum || l==r) cout<<"NO"<<"\n";
        else cout<<"YES"<<"\n";
    }
}

 

希望下次能写出A B C D ,再接再厉了!

 

标签:Educational,Rated,int,ll,Codeforces,次数,num,maxn,dis
From: https://www.cnblogs.com/accbulb/p/18030932

相关文章

  • Codeforces 799E Aquarium decoration
    考虑去枚举能满足\(1,2\)的个数\(l\),那自然只能满足\(1\)或\(2\)的个数为\(\max\{k-l,0\}\)。对于还剩下的,可以从只能满足\(1,2\)和不能满足任意一个的选出来。显然如果要选就是选最小的。考虑用个数据结构优化这个过程。查询前\(k\)大的和,插入一个数,可以想......
  • Codeforces 图论题
    CF243BHydra枚举点\(u,v\),或者说枚举边。然后找出\(u,v\)分别所连的点。有数组\(st\),结点\(x\)仅与\(u\)相邻则\(st[x]=1\),仅与\(v\)相邻则\(st[x]=2\),与两个点都相邻则\(st[x]=3\)。用数组\(rest\)记录\(st[x]=3\)的所有\(x\)。先优先选走至多\(h\)个\(......
  • Codeforces 869D The Overdosing Ubiquity
    考虑树的\(\text{dfs}\)(根据当前节点\(u\)找到\(v\)满足存在\((u,v)\),然后走向\(v\)进入更深的搜索)为和能做到\(O(n)\)的复杂度。原因是没有环的情况,到每个点只有一条路径。回到这个题,有\(m\)条边导致到每个点可能有多条路径了。能发现其实还是能\(\text{dfs}\)......
  • Codeforces 1876F - Indefinite Clownfish
    首先注意到这样一个性质:既然两个序列的平均值相同,并且又形成公差\(\pm1\)的等差数列,就必然会存在一个元素\(x\)满足\(x\)在两个序列中都出现过(否则两个序列的值域区间不交,值域区间靠后的那个显然平均值比靠前的那个大)。那么我们枚举\(x\)在两个序列中出现的位置\(p\)和......
  • Codeforces Round 923 (Div. 3)
    A.MakeitWhite#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingi128=__int128;usingldb=longdouble;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;usingvii......
  • Codeforces Round 928 (Div. 4)
    CodeforcesRound928(Div.4)比赛链接A.VladandtheBestofFive思路就是统计字符A和字符B的个数,将个数多的那个输出出来Code#include<bits/stdc++.h>usingnamespacestd;#defineall(x)x.begin()+1,x.end()#defineintlonglongvoidsolve(){strings;......
  • Codeforces 1806E Tree Master
    考虑一个最基础的暴力,就是直接记忆化搜索暴力往上跳。但是能发现如果一层的节点数过多,状态数太多,就寄了。再考虑一个基础的暴力,就是直接跳。但是如果要跳的层数过多,就寄了。考虑结合一下,根号分治。对于一层内节点数\(\le\sqrt{n}\)的记录下每两个点间的答案。对于节点数......
  • Codeforces Round 928(Div. 4)
    Dashboard-CodeforcesRound928(Div.4)-Codeforces第一次参加CF,最后一道题连题都没读,下次不会就跳,菜是原罪A:找字符串中A,B数量,遍历一下最后比较即可B:判断是三角形还是正方形,题目表示除了正方形就是三角形,所以直接判断是不是正方形,用ans数组记录每一行1的个数,然后从大......
  • Codeforces Round 900 (Div. 3)
    题目A.只要k出现过就是YES#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){intn,k;cin>>n>>k;map<int,int>mp;for(inti=0,x;i<n;i++){cin......
  • Codeforces Round 928 (Div. 4) (小白的复盘)
    A.VladandtheBestofFive思路:给你一个长度字符串只包含A和B输出最多的字符解法:按题意来Code:#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t--){strings;cin>>s;intcnt=0;fo......