http://acm.pku.edu.cn/JudgeOnline/problem?id=1182
Код:
#include <stdio.h> #include <memory.h> const int MAXN = 50010; int v[3*MAXN]; int FIND(int x) { if ( x!=v[x] ) v[x] = FIND(v[x]); return v[x]; } int same(int x, int y); int kill(int x, int y); int n, k; int main() { scanf("%d %d", &n, &k); int i; int d, x, y; int res = 0; for(i = 0; i < 3*n; i++) v[i] = i; for(i = 0; i < k; i++) { scanf("%d %d %d", &d, &x, &y); x--; y--; if ( x>=n||y>=n ) { res++; continue; } if ( d==1 ) res += same(x, y); else res += kill(x, y); } printf("%d\n", res); return 0; } int next(int x) { return (x+n)%(3*n); } int prev(int x) { return (x+2*n)%(3*n); } int same(int x, int y) { int a = FIND(x); int b = FIND(y); if ( (a%n)==(b%n) && (a!=b) ) return 1; v[b] = a; v[prev(b)] = prev(a); v[next(b)] = next(a); return 0; } int kill(int x, int y) { int a = FIND(next(x)); int b = FIND(y); if ( (a%n)==(b%n) && (a!=b) ) return 1; a = FIND(x); v[b] = next(a); v[prev(b)] = a; v[next(b)] = prev(a); return 0; }