Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) 总结

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");
    }
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12547434.html