Codeforces Round 859

目录

A. Plus or Minus

B. Grab the Candies

C. Find and Replace

D. Odd Queries

E. Interview

F. Bouncy Ball

G2. Subsequence Addition (Hard Version)


A. Plus or Minus


直接模拟

void solve()
{
    int a,b,c; cin>>a>>b>>c;
    a+b==c?puts("+"):puts("-");

    return ;
}

B. Grab the Candies


先偶数再奇数即可所有只需要看总和

void solve()
{
   cin>>n;
   LL s1=0,s2=0;
   for(int i=1;i<=n;i++) 
   {
       int x; cin>>x;
       if(x&1) s2+=x;
       else s1+=x;
   }
   s1>s2?puts("YES"):puts("NO");
    return ;
}

C. Find and Replace


直接第一个变成0或者1都行后面一定会对应变化如果是出现相等就不行

void solve()
{
   cin>>n;
   string a; cin>>a;
    int f=0;
    q[a[0]]=1;
    for(int i=1;i<n;i++)
    {
        if(!q.count(a[i])) q[a[i]]=q[a[i-1]]^1;
        if(q[a[i]]==q[a[i-1]]) 
        {
            f=1;
            break;
        }
    }
    q.clear();
    if(f) puts("NO");
    else puts("YES");
    return ;
}

D. Odd Queries


简单区间查询直接使用前缀和进行维护即可

void solve()
{
   cin>>n>>m;
   LL sum=0;
   for(int i=1;i<=n;i++)
   {
       cin>>a[i];
       sum+=a[i];
       a[i]+=a[i-1];
   }
   while(m--)
   {
       int l,r,k; cin>>l>>r>>k;
       //l++,r++;
       LL ans=a[l-1]-a[r];
       LL res=sum+ans+k*(r-l+1);
       if(res&1) puts("YES");
       else puts("NO");
   }

E. Interview


简单交互题一般都是二分我们这里使用前缀和维护然后二分查询是不是满足然后改变中间mid即可

void solve()
{
        cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],sum[i]=a[i];
    for(int i=1;i<=n;i++) sum[i]+=sum[i-1];
    int l=1,r=n;
    while(l<r)
    {
        int mid=l+r>>1;
        cout<<"? "<<mid-l+1<<" ";
        fflush(stdout);
        for(int i=l;i<=mid;i++){
            cout<<i<<" ";
            fflush(stdout);
        }
        cout<<endl;
        fflush(stdout);
        ll res; cin>>res;
        if(res!=sum[mid]-sum[l-1]) r=mid;
        else l=mid+1;
    }
    cout<<"! "<<l<<endl;
    fflush(stdout);
        return ;
}

F. Bouncy Ball


我们直接模拟弹弹的这个过程接着我们发现题目提示我们nm的数据范围我们最多弹nm所有点都有了依照鸽巢原理一定会重复所以这个时候推出即可

void solve()
{
        cin>>n>>m>>sx>>sy>>ex>>ey>>s;
        int x,y;
        if(s[0]=='D') x=1; else x=-1;
        if(s[1]=='R') y=1; else y=-1;
        int ans=0;
        bool flag=false;
        int res=0;
        while(sx!=ex||sy!=ey)
        {
            int f=0;
            res++;
            if(sx+x>n||sx+x<=0) x=-x,f++,ans++;
            if(sy+y>m||sy+y<=0) y=-y,f++,ans++;
            if(f==2) ans--;
            sx+=x,sy+=y;
            if(ans>n*m){
                flag=true;
                break;
            }
        }
        if(!flag) cout<<ans<<endl;
        else cout<<-1<<endl;
        return ;
}

G2. Subsequence Addition (Hard Version)


后面的数一定是由前面的数构成的如果说你这个数比前面的总和还要大是肯定不可能的前面的数可以构造出后面的所有的数所以进行前缀和维护即可

void solve()
{
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        sort(a+1,a+1+n);
        if(a[1]!=1){
            cout<<"NO"<<endl;
            return ;
        }
        b[0]=0;
        for(int i=1;i<=n;i++) b[i]=b[i-1]+a[i];
        b[0]=1;
        for(int i=1;i<=n;i++){
            if(a[i]>b[i-1]){
                cout<<"NO"<<endl;
                return ;
            }
        }
        cout<<"YES"<<endl;
        return ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值