首页 > 其他分享 >Codeforces Round 703 (Div. 2) A-D

Codeforces Round 703 (Div. 2) A-D

时间:2023-05-18 19:00:52浏览次数:48  
标签:前缀 int mid Codeforces else ans Div 703 secpoi

Codeforces Round 703 (Div. 2)

 

A. Shifting Stacks

int a[N];
void solve(){
    int n=read(),ans=1;
    for(int i=1;i<=n;i++)a[i]=read();
    int rest=0,last=-1;
    for(int i=1;i<=n;i++){
        a[i]+=rest;
        rest=a[i]-last-1;
        last++;
        if(rest<0){
            ans=0;
            break;
        }
    }  
    puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

B. Eastern Exhibition

int x[N],y[N];
void solve(){
    int n=read();
    for(int i=1;i<=n;i++){
        x[i]=read(),y[i]=read();
    }
    if(n%2){
        cout<<1<<'\n';
        return ;
    }
    sort(x+1,x+1+n);sort(y+1,y+1+n);
    cout<<(x[n/2+1]-x[n/2]+1)*(y[n/2+1]-y[n/2]+1)<<'\n';
    
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

C1&&C2. Guessing the Greatest

这题很明显 需要通过第二大的值的位置来找最大值

先询问整体的第二大值 然后通过询问知道最大值在第二大值的哪一边

然后二分这一边即可

注意:询问的时候注意l,r不能相等 需要一些特判

int ask(int l,int r){
    cout<<"? "<<l<<" "<<r<<endl;
    return read(); 
}
void solve(){
    int n=read(),l=1,r=n;
    while(l<r){
        int secpoi=ask(l,r);
        int left=0;
        if(secpoi==n||(secpoi!=1&&secpoi==ask(1,secpoi)))left=1,r=secpoi-1;
        else l=secpoi+1;
        if(left==1){
            while(l+1<r){
                int mid=l+r>>1;
                if(ask(mid,secpoi)==secpoi) l=mid;
                else {
                    r=mid-1;
                }
            }
        }else {
            while(l+1<r){
                int mid=l+r>>1;
                if(ask(secpoi,mid)==secpoi) r=mid;
                else {
                    l=mid+1;
                }
            }
        }
        if(l+1==r){
            if(l==secpoi){l=r;
                break;}
            else if(r==secpoi){ r=l;
                break;}
        }
        if(l+1==r){
           int p=ask(l,r);
            if(l==p)l=r;
            else if(r==p) r=l;
        }
        
    }
    cout<<"! "<<l<<endl;
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

D. Max Median

明显的 答案具有二分性 所有选择二分答案

将mid小的值赋值为-1 比mid大的值赋值为1

然后求前缀和 和前缀最小值 如果前缀和减去前缀最小值大于0 说明是可行的

因为前缀最小值代表了前面有几个数小于mid 前缀和则是代表了有x个数大于等于mid 相减就去除了之前的数组造成的影响

int a[N],b[N],sum[N],minn[N],n,m;
bool check(int x) {
    for(int i=1;i<=n;i++)b[i]=(a[i]>=x?1:-1);
    for(int i=1;i<=n;i++)sum[i]=sum[i-1]+b[i],minn[i]=min(minn[i-1],sum[i]);
    for(int i=m;i<=n;i++)if(sum[i]-minn[i-m]>0)return true;
    return false;
}
int bs2(int l, int r){ 
    while (l < r){
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}
void solve(){
    n=read(),m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    cout<<bs2(1,n)<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

标签:前缀,int,mid,Codeforces,else,ans,Div,703,secpoi
From: https://www.cnblogs.com/edgrass/p/17413035.html

相关文章

  • 「解题报告」P3703 [SDOI2017]树点涂色
    有趣题,代码超好写,而且思路超有趣!!!首先发现操作1的操作都是某个点到根,不难发现这样每种颜色一定对应着树上的一条链。那么操作2可以直接树上查分求答案,这样我们只需要考虑维护每个点到根的链的数量了。怎么维护链的数量?发现这个操作1长得和LCT的Access操作一模一样啊,所......
  • Codeforces Round 868 (Div. 2) A-D
    CodeforcesRound868(Div.2) A.A-characteristicintfac[N];map<int,int>mp;voidinit(){fac[1]=0;mp[0]=1;for(inti=2;i<N;i++){fac[i]=fac[i-1]+(i-1);mp[fac[i]]=i;}}voidsolve(){intn=read(),k=rea......
  • Codeforces Round 873 (Div. 2)
    CodeforcesRound873(Div.2)链接CodeforcesRound873(Div.2)A题打印2-n并且计算总和,然后找到严格大于sum的n的倍数记为x,然后用这个x减去sum得到a.然后先打印a然后再打印2-n#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include......
  • Codeforces Round 767 (Div. 1) E. Groceries in Meteor Town (Kruskal重构树 + 线段
    传送门  出现最大路径权值就应该联想到克鲁斯卡尔重构树,我们对于克鲁斯卡尔重构树求一遍dfs序,维护所有白色点的最大最小dfn(包括出发点),求出最大最小dfn的最近公共祖先既是答案。注意需要特判一下除了本身以外没有白色点情况。#include<bits/stdc++.h>intn,m;constintN......
  • Codeforces Round 873 A~E
    CodeforcesRound873(Div.1)A.CountingOrders对于每个\(a_i\),可以计算出\(c_i\)表示有多少个\(b_j\lta_i\)。那么第\(i\)个人就有\(c_i\)种可能的位置。注意到如果将\(a\)升序排序,则能放的位置集合从前往后是包含的关系。所以将\(a\)排序(等价于将\(c\)排序......
  • DIV 随着滚动条 移动
    <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>codeby:haiw......
  • Educational Codeforces Round 148 (Rated for Div. 2) A-D2
    EducationalCodeforcesRound148(RatedforDiv.2) A.NewPalindromemap<int,int>mp;voidsolve(){strings;mp.clear();cin>>s;for(inti=0;i<s.size()/2;i++){mp[s[i]]++;}puts(mp.size()>=2?"YES......
  • CodeForces 1827 D Two Centroids
    洛谷传送门CF传送门考虑固定一个重心,设\(k\)为重心最大子树大小,答案为\(n-2k\)。构造方法是往最大的子树塞叶子。树的重心有一个很好的性质,就是加一个叶子,重心最多移动一条边的距离。简单证一下,设重心为\(x\),往儿子\(u\)的子树中加叶子。如果\(sz_u>\left\lfloor......
  • CodeForces 1827 B Range Sorting
    洛谷传送门CF传送门考虑拆贡献\(i-1\simi\),发现当\([1,i-1]\)的最大值大于\([i,n]\)的最小值时\(i-1\simi\)产生\(1\)的贡献。考虑枚举左端点\(j\),设\(x=\max\limits_{k=j}^{i-1}a_k\)。设\(i\)及\(i\)以后第一个\(<x\)的数位置是\(p\),那么......
  • Codeforces 1158E - Strange device(交互)
    一个有点烦的\(8\logn\)的做法。大致想法大家都一样:以\(1\)为根,然后先问出每个点深度,再问出每个点的父亲。首先先用一个log的做法问出树高,具体做法是直接令根节点的\(f\)为二分出的\(mid\),看能否覆盖所有点即可,记最大深度为\(mxdep\)。可以在二分过程中顺带着求出深......