zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 37 (Rated for Div. 2) 920E E. Connected Components?

      OvO http://codeforces.com/contest/920/problem/E

      模拟一遍……

      1.首先把所有数放到一个集合 s 中,并创建一个队列 que

      2.然后每次随便取一个数,并且从集合中删除这个数,将这个数放入 que

      3.que 首元素,记为 now,然后枚举集合 s,每次找到 s 中和 now 相连的元素 x,从 s 中删除元素 x,并且把 x 放入 que 中。

      4.如果 不为空,回到步骤2

      可见就是一个模拟,至于复杂度,计算如下。

      由于每个数字只会从集合 s 中删除一次。步骤3中枚举集合 s 元素的操作中,记成功从集合 s 中删除元素的为有效操作,反之为无效操作,则每一次有效操作必然会使 s 中元素数量减1,所以有效操作复杂度为O(n)。而每次无效操作则必然会使用到一对题目所给的 (x,y),其中 xy 不相连,可见无效操作复杂度为 O(m)

      其他复杂度计算显然。加起来不会超时。

      

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <map>
     7 #include <set>
     8 #include <queue>
     9 
    10 using namespace std;
    11 
    12 const int M=2e5+44;
    13 const int N=2e5;
    14 
    15 vector<int> mp[M];
    16 queue<int> que;
    17 set<int> s;
    18 int n,m;
    19 int lans,ans[M];
    20 
    21 void init()
    22 {
    23     for(int i=0;i<=N;i++)
    24         mp[i].clear();
    25     s.clear();
    26     lans=0;
    27 }
    28 
    29 bool isConnected(int a,int b)
    30 {
    31     vector<int>::iterator it=lower_bound(mp[a].begin(),mp[a].end(),b);
    32     if(it==mp[a].end() || *it!=b) return true;
    33     return false;
    34 }
    35 
    36 void solve()
    37 {
    38     queue<int> dlt;
    39     int now,tmp;
    40     set<int>::iterator it,tmp_it;
    41     for(int i=1;i<=n;i++)
    42         s.insert(i);
    43     while(s.size()>0)
    44     {
    45         while(!que.empty()) que.pop();
    46         while(!dlt.empty()) dlt.pop();
    47         lans++; ans[lans]=0;
    48         it=s.begin(); now=*it;
    49 //        cout<<now<<' ';
    50         s.erase(it); ans[lans]++;
    51         que.push(now);
    52         while(!que.empty())
    53         {
    54             now=que.front(); que.pop();
    55             for(it=s.begin();it!=s.end();it++)
    56                 if(isConnected(now,*it))
    57                 {
    58 //                    cout<<*it<<' ';
    59                     que.push(*it),ans[lans]++,dlt.push(*it);
    60                 }
    61             while(!dlt.empty())
    62             {
    63                 tmp=dlt.front(); dlt.pop();
    64                 s.erase(tmp);
    65             }
    66         }
    67 //        cout<<endl;
    68 //        cout<<s.size()<<endl;
    69     }
    70 }
    71 
    72 int main()
    73 {
    74     init();
    75     int a,b;
    76     scanf("%d%d",&n,&m);
    77     for(int i=1;i<=m;i++)
    78     {
    79         scanf("%d%d",&a,&b);
    80         mp[a].push_back(b),mp[b].push_back(a);
    81     }
    82     for(int i=1;i<=n;i++)
    83         sort(mp[i].begin(),mp[i].end());
    84     solve();
    85     sort(ans+1,ans+lans+1);
    86     printf("%d
    ",lans);
    87     for(int i=1;i<=lans;i++)
    88         printf("%d ",ans[i]);
    89     puts("");
    90     return 0;
    91 }
    View Code
  • 相关阅读:
    zoj 2316 Matrix Multiplication 解题报告
    BestCoder7 1001 Little Pony and Permutation(hdu 4985) 解题报告
    codeforces 463C. Gargari and Bishops 解题报告
    codeforces 463B Caisa and Pylons 解题报告
    codeforces 463A Caisa and Sugar 解题报告
    CSS3新的字体尺寸单位rem
    CSS中文字体对照表
    引用外部CSS的link和import方式的分析与比较
    CSS样式表引用方式
    10个CSS简写/优化技巧
  • 原文地址:https://www.cnblogs.com/FxxL/p/8413646.html
Copyright © 2011-2022 走看看