标签:spec tab cat origin list asi bool tchar contain
Time Limit: 1000MS | Memory Limit: 20000K | |
Total Submissions: 61692 | Accepted: 29146 |
Description
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
Source
[Submit] [Go Back] [Status] [Discuss]
思路:
维护一个小根堆的并查集,最后O(n)过一遍就可以了
CODE
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <cmath> 6 #include <assert.h> 7 #include <vector> 8 9 #define dbg(x) cout << #x << "=" << x << endl 10 11 using namespace std; 12 typedef long long LL; 13 const int maxn = 30007; 14 15 int fa[maxn]; 16 int n,m,ans,cnt; 17 bool vis[maxn]; 18 int a[maxn]; 19 20 //vector <int> v; 21 22 void init() 23 { 24 for(int i = 1; i <= n; i++) { 25 fa[i] = i; 26 } 27 } 28 29 int fid(int x) 30 { 31 int r = x; 32 while(fa[r] != r) { 33 r = fa[r]; 34 } 35 int i,j;///路径压缩 36 i = x; 37 while(fa[i] != r) { 38 j = fa[i]; 39 fa[i] = r; 40 i = j; 41 } 42 return r; 43 } 44 45 void join(int r1, int r2)///合并 46 { 47 int fidroot1 = fid(r1), fidroot2 = fid(r2); 48 int root = min(fidroot1, fidroot2); 49 if(fidroot1 != fidroot2) { 50 fa[fidroot1] = root; 51 fa[fidroot2] = root; 52 } 53 } 54 55 template<class T>inline void read(T &res) 56 { 57 char c;T flag=1; 58 while((c=getchar())<‘0‘||c>‘9‘)if(c==‘-‘)flag=-1;res=c-‘0‘; 59 while((c=getchar())>=‘0‘&&c<=‘9‘)res=res*10+c-‘0‘;res*=flag; 60 } 61 62 namespace _buff { 63 const size_t BUFF = 1 << 19; 64 char ibuf[BUFF], *ib = ibuf, *ie = ibuf; 65 char getc() { 66 if (ib == ie) { 67 ib = ibuf; 68 ie = ibuf + fread(ibuf, 1, BUFF, stdin); 69 } 70 return ib == ie ? -1 : *ib++; 71 } 72 } 73 74 int qread() { 75 using namespace _buff; 76 int ret = 0; 77 bool pos = true; 78 char c = getc(); 79 for (; (c < ‘0‘ || c > ‘9‘) && c != ‘-‘; c = getc()) { 80 assert(~c); 81 } 82 if (c == ‘-‘) { 83 pos = false; 84 c = getc(); 85 } 86 for (; c >= ‘0‘ && c <= ‘9‘; c = getc()) { 87 ret = (ret << 3) + (ret << 1) + (c ^ 48); 88 } 89 return pos ? ret : -ret; 90 } 91 92 int main() 93 { 94 while(scanf("%d %d",&n, &m) && (n+m)) { 95 int ans = 0; 96 if(m == 0) { 97 puts("1"); 98 continue; 99 } 100 init(); 101 //v.clear(); 102 while(m--) { 103 int k; 104 scanf("%d",&k); 105 memset(a,0,sizeof(a)); 106 for(int i = 1; i <= k; ++i) { 107 scanf("%d",&a[i]); 108 if(i == 1) continue; 109 join(a[i], a[i-1]); 110 } 111 } 112 int pre = fid(0); 113 for(int i = 0; i < n; ++i) { 114 int now = fid(i); 115 //printf("fa[%d]:%d\n",i,now); 116 if(now == pre) { 117 ans++; 118 } 119 } 120 cout << ans << endl; 121 } 122 return 0; 123 }
标签:spec tab cat origin list asi bool tchar contain
原文地址:https://www.cnblogs.com/orangeko/p/12264121.html