1003. Parity(并查集)

1003

看篇国家论文

《从《parity》的解法谈程序优化》

对于区间i,j 如果用sum[i],sum[j]来表示到i的1的个数的奇偶性 那么仔细想下 sum[i-1] 若与区间i,j相等 则sum[j]为偶 否则为奇

那么就可以把性质相同的合并在一个集合里 性质相同为朋友 不同为敌人 可以把一个端点分成两个 一个是自己一个是他的敌人 当与别的点合并时根据朋友的朋友是朋友 朋友的敌人是敌人 敌人的敌人 是朋友 这些原则 来进行合并 ,并判断是不是有矛盾

端点比较大 用map离散化下 map相对其它离散化方法操作还是比较简单点 

  1 #include <iostream>

  2 #include<cstdio>

  3 #include<cstring>

  4 #include<algorithm>

  5 #include<cstdlib>

  6 #include<map>

  7 using namespace std;

  8 #define N 10010

  9 map<int,int>q;//map进行离散化

 10 int que[N];

 11 struct node

 12 {

 13     int l,r,d;

 14 }p[N];

 15 int father[N<<1];

 16 int find(int x)

 17 {

 18     if(father[x]!=x)

 19     {

 20         father[x] = find(father[x]);

 21     }

 22     return father[x];

 23 }

 24 void union1(int x,int y)

 25 {

 26     int tx = find(x);

 27     int ty = find(y);

 28     if(tx!=ty)

 29     father[tx] = ty;

 30 }

 31 int main()

 32 {

 33     int i,k,n,g=0;

 34     char cc[10];

 35     while(scanf("%d",&n)!=EOF)

 36     {

 37         if(n==-1)

 38         break;

 39         q.clear();

 40         g = 0;

 41         scanf("%d",&k);

 42         for(i = 1; i <= k ; i++)

 43         {

 44             scanf("%d%d%s",&p[i].l,&p[i].r,cc);

 45             if(strcmp(cc,"even")==0)

 46             p[i].d = 0;

 47             else

 48             p[i].d = 1;

 49             que[g++] = p[i].l;

 50             que[g++] = p[i].r;

 51         }

 52         sort(que,que+g);

 53         int o = 1;

 54         q[que[0]] = o;

 55         for(i = 1 ; i < g ; i++)

 56         {

 57             if(que[i]!=que[i-1])

 58             {

 59                 o++;

 60                 q[que[i]] = o;

 61             }

 62         }

 63         for(i = 1; i <= o+N ; i++)

 64             father[i] = i;

 65         for(i = 1; i <= k ; i++)

 66         {

 67             int tx = q[p[i].l]-1;

 68             int ty = q[p[i].r];

 69             if(p[i].d)

 70             {

 71                 if(find(tx)==find(ty))

 72                 {

 73                     printf("%d\n",i-1);

 74                     break;

 75                 }

 76                 else

 77                 {

 78                     union1(tx,ty+N);//敌人的敌人是朋友

 79                     union1(tx+N,ty);

 80                 }

 81             }

 82             else

 83             {

 84                 if(find(tx)==find(ty+N))

 85                 {

 86                     printf("%d\n",i-1);

 87                     break;

 88                 }

 89                 else

 90                 {

 91                     union1(tx,ty);//朋友的朋友是朋友

 92                     union1(tx+N,ty+N);

 93                 }

 94             }

 95         }

 96         if(i==k+1)

 97         printf("%d\n",k);

 98     }

 99     return 0;

100 }
View Code

 

你可能感兴趣的:(并查集)