• Codeforces Round #544 (Div. 3) D F1 F2


    题目链接:D. Zero Quantity Maximization

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 200005
    #define LL long long
    #define pii pair<LL,LL>
    map<pair<LL,LL>,LL>mp,mpp;
    LL a[maxn],b[maxn];
    LL gcd(LL a,LL b){
        return b?gcd(b,a%b):a;
    }
    int main(){
       LL n;
       scanf("%lld",&n);
       for(LL j=0;j<n;j++){
          scanf("%lld",&a[j]);
       }
       for(LL k=0;k<n;k++){
          scanf("%lld",&b[k]);
       }
       LL mx = 0,ans = 0;
       for(LL j=0;j<n;j++){
          LL z = gcd(abs(a[j]),abs(b[j]));
          if(b[j]<0){
             a[j] = -a[j];
             b[j] = -b[j];
          }
          if(a[j]==0){
             if(b[j]==0) ans++;
             continue;
          }
          if(b[j]==0){
               mp[make_pair(1LL*0,1LL*0)]++;
               mx = max(mx, mp[make_pair(1LL*0,1LL*0)]);
               continue;
          }
          mp[make_pair(a[j]/z,b[j]/z)]++;
          mx = max(mx, mp[make_pair(a[j]/z,b[j]/z)]);
       }
       printf("%lld
    ",mx+ans);
    }

     F1: Spanning Tree with Maximum Degree

    判断一下 bfs 就ok

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 200005
    #define LL long long
    vector<int>q[maxn];
    int fa[maxn];
    bool flag[maxn];
    void bfs(int u){
        queue<int>Q;
        Q.push(u);
        while(!Q.empty()){
            u = Q.front();
            Q.pop();
            for(int j=0;j<q[u].size();j++){
                int v = q[u][j];
                if(!flag[v]){
                    flag[v] = 1;
                    Q.push(v);
                    printf("%d %d
    ",u,v);
                }
            }
        }
    }
    int main(){
        memset(fa,0,sizeof(fa));
        memset(flag,0,sizeof(flag));
        int n,m,mx=0,in=-1;
        scanf("%d%d",&n,&m);
        for(int j=0;j<m;j++){
           int u,v;
           scanf("%d%d",&u,&v);
           q[u].push_back(v);
           q[v].push_back(u);
           fa[u]++;
           fa[v]++;
           if(mx<fa[u]){
              mx = fa[u];
              in = u;
           }
           if(mx<fa[v]){
              mx = fa[v];
              in = v;
           }
        }
    //    cout<<in<<endl;
        flag[in] = 1;
        bfs(in);
    }

     F2 :F2. Spanning Tree with One Fixed Degree

    先判断 节点的度够不够  不够直接 输出 NO

    dfs 判断1有多少个连通块 如果连通块数量 大于d 直接输出NO

    最后 添加 在 1 节点添加 d-连通块个数个 点   bfs

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 200005
    #define LL long long
    #define pii pair<int,int>
    vector<int>q[maxn],z;
    vector<pii>lis;
    bool fa[maxn];
    int n,m,d;
    void dfs(int u){
        for(int j=0;j<q[u].size();j++){
            int v = q[u][j];
            if(!fa[v]){
                fa[v] = 1;
                dfs(v);
            }
        }
    }
    bool bfs(int u){
        queue<int>Q;
        int sum = 0;
        Q.push(u);
        while(!Q.empty()){
            u = Q.front();
            Q.pop();
            for(int j=0;j<q[u].size();j++){
                int v = q[u][j];
                if(!fa[v]){
                    fa[v] = 1,sum++;
                    Q.push(v);
                    //cout<<u<<" "<<v<<endl;
                    lis.push_back(make_pair(u,v));
                    if(u==1){
                        d--;
                        if(d==0) break;
                    }
                }
            }
        }
        //cout<<sum<<" "<<n-1<<endl;
        if(sum!=(n-1)) return 0;
        return 1;
    }
    int main(){
        scanf("%d%d%d",&n,&m,&d);
        memset(fa,0,sizeof(fa));
        int sum = 0;
        for(int j=0;j<m;j++){
            int u,v;
            scanf("%d%d",&u,&v);
            q[u].push_back(v);
            q[v].push_back(u);
            if(u==1||v==1) sum++;
        }
        if(sum<d){
            printf("NO
    ");
            return 0;
        }
        fa[1]=1;
        set<int>se;
        for(int j=0;j<q[1].size();j++){
            int v = q[1][j];
            if(!fa[v]){
                fa[v]=1;
                se.insert(v);
                dfs(v);
            }
        }
        //cout<<se.size()<<endl;
        if(se.size()>d){
            printf("NO
    ");
            return 0;
        }
        //cout<<*se.begin()<<endl;
        for(int j=0;j<q[1].size()&&se.size()<d;j++){
            se.insert(q[1][j]);
        }
    
        q[1].clear();
        for(auto &i:se){
            //cout<<i<<endl;
            q[1].push_back((int)i);
        }
        memset(fa,0,sizeof(fa));
        fa[1] = 1;
        bfs(1);
        printf("YES
    ");
        for(int j=0;j<lis.size();j++){
            pii pa = lis[j];
            printf("%d %d
    ",pa.first,pa.second);
        }
    }
  • 相关阅读:
    【刷题】洛谷 P3808 【模板】AC自动机(简单版)
    【刷题】BZOJ 3172 [Tjoi2013]单词
    【刷题】BZOJ 2434 [Noi2011]阿狸的打字机
    【刷题】BZOJ 1211 [HNOI2004]树的计数
    【刷题】BZOJ 1195 [HNOI2006]最短母串
    【刷题】BZOJ 1095 [ZJOI2007]Hide 捉迷藏
    【刷题】BZOJ 1030 [JSOI2007]文本生成器
    【刷题】BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
    【刷题】BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster
    【刷题】BZOJ 2753 [SCOI2012]滑雪与时间胶囊
  • 原文地址:https://www.cnblogs.com/Dvelpro/p/10553803.html
Copyright © 2020-2023  润新知