• Educational Codeforces Round 3


    这场要是算分的话估计就有机会涨到紫了,4个题1A。

    A题:

    #include<bits/stdc++.h>
    #define REP(i,a,b) for(int i=a;i<=b;i++)
    #define MS0(a) memset(a,0,sizeof(a))
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=1000100;
    const int INF=1<<29;
    
    int n,m;
    int a[maxn];
    
    int main()
    {
        freopen("in.txt","r",stdin);
        while(cin>>n>>m){
            REP(i,1,n) scanf("%d",&a[i]);
            sort(a+1,a+n+1);
            int ans=0;
            for(int i=n;i>=1;i--){
                if(m<=0) break;
                m-=a[i];
                ans++;
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code

    B题:

    #include<bits/stdc++.h>
    #define REP(i,a,b) for(int i=a;i<=b;i++)
    #define MS0(a) memset(a,0,sizeof(a))
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=1000100;
    const int INF=1<<29;
    
    int n,m;
    int a[maxn];
    ll cnt[maxn];
    
    ll dfs(int st,int cur)
    {
        if(st>=m||cur>m) return 0;
        ll res=cnt[st]*cnt[cur];
        if(cur==m) return res+dfs(st+1,st+2);
        else return res+dfs(st,cur+1);
    }
    
    int main()
    {
        freopen("in.txt","r",stdin);
        while(cin>>n>>m){
            MS0(cnt);
            REP(i,1,n) scanf("%d",&a[i]),cnt[a[i]]++;
            cout<<dfs(1,2)<<endl;
        }
        return 0;
    }
    View Code

    C题:

    #include<bits/stdc++.h>
    #define REP(i,a,b) for(int i=a;i<=b;i++)
    #define MS0(a) memset(a,0,sizeof(a))
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=1000100;
    const int INF=1<<29;
    
    int n;
    int a[maxn];
    
    bool cmp(int a,int b)
    {
        return a>b;
    }
    
    int main()
    {
        freopen("in.txt","r",stdin);
        while(cin>>n){
            ll s=0;
            REP(i,1,n) scanf("%d",&a[i]),s+=a[i];
            sort(a+1,a+n+1,cmp);
            ll ans=0;
            REP(i,1,s%n){
                if(a[i]>s/n+1) ans+=a[i]-(s/n+1);
            }
            REP(i,s%n+1,n){
                if(a[i]>s/n) ans+=a[i]-s/n;
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code

    E题:多次询问包括某条边的最小生成树。树链剖分找这条边路径上的最大边权,然后将这条边权去掉就好了。

    #include<bits/stdc++.h>
    #define REP(i,a,b) for(int i=a;i<=b;i++)
    #define MS0(a) memset(a,0,sizeof(a))
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=1000100;
    const int INF=1<<29;
    
    int n,m;
    ll mst;
    struct Edge
    {
        int u,v;ll w;
        int id;
        friend bool operator<(Edge A,Edge B)
        {
            return A.w<B.w;
        }
    };Edge e[maxn];
    int Fa[maxn];
    struct Tree
    {
        int u,v;
        ll w;
    };Tree tr[maxn];int trn;
    vector<int> G[maxn];
    int fa[maxn],dep[maxn],son[maxn],siz[maxn];
    int top[maxn];
    int id[maxn],num;
    ll Max[maxn<<2];
    ll val[maxn];
    
    int Find(int x)
    {
        return Fa[x]==x?x:Fa[x]=Find(Fa[x]);
    }
    
    void dfs1(int u,int f,int d)
    {
        fa[u]=f;
        dep[u]=d;
        son[u]=0;
        siz[u]=1;
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i];
            if(v==f) continue;
            dfs1(v,u,d+1);
            if(siz[v]>siz[son[u]]) son[u]=v;
            siz[u]+=siz[v];
        }
    }
    
    void dfs2(int u,int tp)
    {
        top[u]=tp;
        id[u]=++num;
        if(son[u]) dfs2(son[u],tp);
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i];
            if(v==fa[u]||v==son[u]) continue;
            dfs2(v,v);
        }
    }
    
    void push_up(int rt)
    {
        Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
    }
    
    void build(int l,int r,int rt)
    {
        if(l==r){
            Max[rt]=val[l];
            return;
        }
        int m=(l+r)>>1;
        build(lson);
        build(rson);
        push_up(rt);
    }
    
    ll query(int L,int R,int l,int r,int rt)
    {
        if(L<=l&&r<=R) return Max[rt];
        int m=(l+r)>>1;
        ll res=-INF;
        if(L<=m) res=max(res,query(L,R,lson));
        if(R>m) res=max(res,query(L,R,rson));
        return res;
    }
    
    ll cha(int u,int v)
    {
        ll res=-INF;
        while(top[u]!=top[v]){
            if(dep[top[u]]<dep[top[v]]) swap(u,v);
            res=max(res,query(id[top[u]],id[u],1,num,1));
            u=fa[top[u]];
        }
        if(u!=v){
            if(dep[u]>dep[v]) swap(u,v);
            res=max(res,query(id[son[u]],id[v],1,num,1));
        }
        return res;
    }
    
    bool cmpID(Edge A,Edge B)
    {
        return A.id<B.id;
    }
    
    int main()
    {
        freopen("in.txt","r",stdin);
        while(cin>>n>>m){
            REP(i,1,m) scanf("%d%d%I64d",&e[i].u,&e[i].v,&e[i].w),e[i].id=i;
            sort(e+1,e+m+1);
            REP(i,1,n) Fa[i]=i;
            mst=0;trn=0;
            REP(i,1,n) G[i].clear();
            REP(i,1,m){
                int x=Find(e[i].u),y=Find(e[i].v);
                if(x!=y){
                    Fa[x]=y;
                    mst+=e[i].w;
                    tr[++trn]={e[i].u,e[i].v,e[i].w};
                    G[e[i].u].push_back(e[i].v);
                    G[e[i].v].push_back(e[i].u);
                }
            }
            //REP(i,1,trn) cout<<tr[i].u<<" "<<tr[i].v<<" -- "<<tr[i].w<<endl;
            dfs1(1,0,1);
            num=0;
            dfs2(1,1);
            REP(i,1,trn){
                if(dep[tr[i].u]>dep[tr[i].v]) swap(tr[i].u,tr[i].v);
                val[id[tr[i].v]]=tr[i].w;
            }
            build(1,num,1);
            sort(e+1,e+m+1,cmpID);
            REP(i,1,m){
                ll tmp=cha(e[i].u,e[i].v);
                printf("%I64d
    ",mst-tmp+e[i].w);
            }
        }
        return 0;
    }
    View Code
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    CCF计算机职业资格认证考试 201809-2 买菜
    【CodeVS3013】单词背诵
    【CodeVS3304】水果姐逛水果街Ⅰ
    【CodeVS4246】奶牛的身高
    【hdu1247】Hat’s Words
    【CodeVS4189】字典
    【CodeVS4244】平衡树练习
    【poj3264】Balanced Lineup
    【树状数组】
    【CodeVS1163】访问艺术馆
  • 原文地址:https://www.cnblogs.com/--560/p/5061304.html
Copyright © 2020-2023  润新知