http://poj.org/problem?id=1182
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 55565 | Accepted: 16296 |
100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5
3
题意不解释,中文的。但是这题坑的地方绝对不敢想象:居然不可以用多样例输入。真的是醉了,就这个问题,无尽的WA,555555。
看解题大概的思路吧:
仔细斟酌,相信你会有所收获的。这是我们老师的讲义。
附上AC代码:
#include <iostream> #include <cstdio> #include <string> #include <cmath> #include <iomanip> #include <ctime> #include <climits> #include <cstdlib> #include <cstring> #include <cctype> #include <algorithm> #include <queue> #include <vector> #include <set> #include <map> #include <stack> #include <deque> //#pragma comment(linker, "/STACK:102400000, 102400000") using namespace std; typedef long long ll; const double pi = acos(-1.0); const double e = exp(1.0); const double eps = 1e-8; const int maxn = 50005; int p[maxn]; short r[maxn]; int n, k; int find(int x); void merge(int x, int y, short h); int main(){ ios::sync_with_stdio(false); // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); scanf("%d%d", &n, &k); int ans = 0; for (int i=1; i<=n; i++) p[i] = i; short d; int x, y; while (k--){ scanf("%hd%d%d", &d, &x, &y); if (x>n || y>n){ ans++; continue; } if (1 == d){ if (find(x) == find(y)){ if (r[x] != r[y]) ans++; } else merge(x, y, 0); } else{ if (find(x) == find(y)){ if (r[x] != ((r[y]+1)%3)) ans++; } else merge(x, y, 1); } } printf("%d\n", ans); return 0; } int find(int x){ if (p[x] == x) return x; int t = p[x]; p[x] = find(p[x]); r[x] = (r[t]+r[x])%3; return p[x]; } void merge(int x, int y, short h){ int a=find(x), b=find(y); p[a] = b; r[a] = (r[y]-r[x]+3+h)%3; }