Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 66802 | Accepted: 19713 |
Description
Input
Output
Sample Input
100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5
Sample Output
3
题目有个坑啊啊x<0||x>=n||y<0||y>=n 也要算上
带rank的
#include
#define MAX_N 200000
int par[MAX_N];
int rank[MAX_N];
void init(int n){
for(int i=0;i=n||y<0||y>=n){
ans++;
continue;
}
if(o==1){
if(same(x,y+n)||same(x,y+n*2)) ans++;
else{
unite(x,y);
unite(x+n,y+n);
unite(x+n*2,y+n*2);
}
}else{
if(same(x,y)||same(x,y+n*2)) ans++;
else{
unite(x,y+n);
unite(x+n,y+n*2);
unite(x+n*2,y);
}
}
}
printf("%d\n",ans);
return 0;
}
#include
#define MAX_N 160000
int par[MAX_N];
void init(int n) {
for (int i = 0; i <= n;i++) par[i]=i;
}
int find(int u) {
return par[u] == u ? u : par[u] = find(par[u]);
}
void unite(int x, int y) {
par[find(y)] = find(x);
}
bool same(int x,int y){
return find(x)==find(y);
}
int main()
{
int n,k,o,x,y;
scanf("%d%d",&n,&k);
init(n*3);int ans=0;
while(k--){
scanf("%d%d%d",&o,&x,&y);
x--,y--;
if(x<0||x>=n||y<0||y>=n){
ans++;
continue;
}
if(o==1){
if(same(x,y+n)||same(x,y+n*2)) ans++;
else{
unite(x,y);
unite(x+n,y+n);
unite(x+n*2,y+n*2);
}
}else{
if(same(x,y)||same(x,y+n*2)) ans++;
else{
unite(x,y+n);
unite(x+n,y+n*2);
unite(x+n*2,y);
}
}
}
printf("%d\n",ans);
return 0;
}