看篇国家论文
《从《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 ",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 ",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 ",k); 98 } 99 return 0; 100 }