zoukankan      html  css  js  c++  java
  • Codeforces Round #625 (Div. 2) 总结

    A

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 105;
    
    int n,a[N],b[N],p;
    
    signed main() {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) cin>>b[i];
        for(int i=1;i<=n;i++) a[i]-=b[i];
        int sum=0;
        for(int i=1;i<=n;i++) sum+=a[i];
        int tot=0;
        for(int i=1;i<=n;i++) if(a[i]>0) tot+=a[i];
        if(sum>0) {
            cout<<1<<endl;
        }
        else {
            if(tot==0) cout<<-1<<endl;
            else {
                int ans=1;
                while(sum<=0) {
                    sum+=tot;
                    ++ans;
                }
                cout<<ans<<endl;
            }
        }
    }
    
    

    B

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int O = 5e5;
    const int N = 1e6;
    
    int n,a[N],s[N];
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) s[a[i]-i+O]+=a[i];
        cout<<*max_element(s,s+N);
    }
    
    

    C

    对字母组合从大到小贪心无后效

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1005;
    
    int n;
    string s;
    
    signed main() {
        cin>>n>>s;
        while(true) {
            int fg=0;
            for(char c='z'-1;c>='a';c--) {
                for(int i=0;i<s.length()-1;i++) {
                    if(s[i]==c&&s[i+1]==c+1) s.erase(i+1,1), fg=1;
                    if(fg) goto E;
                    if(s[i]==c+1&&s[i+1]==c) s.erase(i,1), fg=1;
                    if(fg) goto E;
                }
            }
            E:if(fg==0) break;
        }
        cout<<n-s.length()<<endl;
    }
    
    

    D

    反图上跑 DFS

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    const int N = 500005;
    
    int n,m,q,p[N],d[N],v[N],ans;
    vector <int> g[N],ng[N];
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>m;
        for(int i=1;i<=m;i++) {
            int t1,t2;
            cin>>t1>>t2;
            g[t1].push_back(t2);
            ng[t2].push_back(t1);
        }
        cin>>q;
        for(int i=1;i<=q;i++) {
            cin>>p[i];
        }
        memset(d,0x3f,sizeof d);
        d[p[q]]=0;
        queue <int> que;
        que.push(p[q]);
        while(que.size()) {
            int p=que.front(); que.pop();
            for(int q:ng[p]) {
                if(d[q]>d[p]+1) {
                    d[q]=d[p]+1;
                    if(!v[q]) que.push(q), v[q]=1;
                }
            }
        }
        for(int i=1;i<q;i++) {
            if(d[p[i]]!=d[p[i+1]]+1) ++ans;
        }
        cout<<ans<<" ";
        for(int i=1;i<q;i++) {
            if(d[p[i]]==d[p[i+1]]+1) {
                int fg=0;
                for(int q:g[p[i]]) if(q!=p[i+1]) {
                    if(d[p[i]]==d[q]+1) fg=1;
                }
                if(fg) ++ans;
            }
        }
        cout<<ans;
    }
    
    

    E

    放到二维平面上,扫描线+线段树维护

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 4000005;
    const int M = 1000001;
    int n,m,p,a[N],b[N],val[N],tag[N],t1,t2,t3;
    
    struct mon {
        int x,y,z;
        bool operator < (const mon &b) const {
            return y<b.y;
        }
    } c[N];
    
    void pushup(int p) {
        val[p]=max(val[p*2],val[p*2+1]);
    }
    
    void pushdown(int p) {
        if(tag[p]) {
            tag[p*2]+=tag[p];
            tag[p*2+1]+=tag[p];
            val[p*2]+=tag[p];
            val[p*2+1]+=tag[p];
            tag[p]=0;
        }
    }
    
    void build(int p,int l,int r) {
        if(l==r) {
            val[p]=-b[l];
        }
        else {
            build(p*2,l,(l+r)/2);
            build(p*2+1,(l+r)/2+1,r);
            pushup(p);
        }
    }
    
    void modify(int p,int l,int r,int ql,int qr,int x) {
        if(l>qr||r<ql) return;
        if(l>=ql&&r<=qr) {
            tag[p]+=x;
            val[p]+=x;
        }
        else {
            pushdown(p);
            modify(p*2,l,(l+r)/2,ql,qr,x);
            modify(p*2+1,(l+r)/2+1,r,ql,qr,x);
            pushup(p);
        }
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>m>>p;
        memset(a,0x3f,sizeof a);
        for(int i=1;i<=n;i++) {
            cin>>t1>>t2;
            a[t1]=min(a[t1],t2);
        }
        for(int i=M;i>=1;--i) a[i]=min(a[i],a[i+1]);
        memset(b,0x3f,sizeof b);
        for(int i=1;i<=m;i++) {
            cin>>t1>>t2;
            b[t1]=min(b[t1],t2);
        }
        for(int i=M;i>=1;--i) b[i]=min(b[i],b[i+1]);
        for(int i=1;i<=p;i++) {
            cin>>t1>>t2>>t3;
            c[i]={t2+1,t1+1,t3};
        }
        sort(c+1,c+p+1);
        build(1,1,M);
        int pos=1;
        int ans=-1e18;
        for(int i=1;i<=M;i++) {
            while(c[pos].y<=i && pos<=p) {
                modify(1,1,M,c[pos].x,M,c[pos].z);
                ++pos;
            }
            ans=max(ans,val[1]-a[i]);
        }
        cout<<ans;
    }
    
    

    F

    (0) 的位置哈希起来即可

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N = 2e6+5;
    int mod=1e9+7,bas=31;
    int h[2][N],pw[N],cnt[N];
    char c[N];
    int n,q;
    
    int query(int l,int r,int op) {
        return ((h[op][r]-h[op][l-1]*pw[cnt[r]-cnt[l-1]])%mod+mod)%mod;
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>c+1;
        for(int i=1;i<=n;i++) {
            h[0][i]=h[0][i-1]; h[1][i]=h[1][i-1]; cnt[i]=cnt[i-1];
            if(c[i]=='0') {
                h[0][i]=(h[0][i]*bas+i%2+1)%mod;
                h[1][i]=(h[1][i]*bas+(i+1)%2+1)%mod;
                ++cnt[i];
            }
        }
        pw[0]=1;
        for(int i=1;i<=n;i++) pw[i]=pw[i-1]*bas%mod;
        cin>>q;
        for(int i=1;i<=q;i++) {
            int t1,t2,len;
            cin>>t1>>t2>>len;
            if(query(t1,t1+len-1,t1&1)==query(t2,t2+len-1,t2&1))
                puts("Yes");
            else puts("No");
        }
    }
    
    
  • 相关阅读:
    网页HTML到8.20前
    数据库SQLServer
    构建之法读后感
    VS2013 生成安装文件
    工大助手(自动化部署)
    工大助手(用户名、密码错误提示)
    工大助手(验证码错误提示)
    工大助手(加权成绩计算)
    Wireshark插件编写
    微软认知服务——人脸识别
  • 原文地址:https://www.cnblogs.com/mollnn/p/12547434.html
Copyright © 2011-2022 走看看