• 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
    ",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 }
    View Code
  • 相关阅读:
    centos6下安装部署hadoop2.2
    centos 卸载自带的 java
    完全分布式Hadoop2.3安装与配置
    hadoop安装与WordCount例子
    CentOS 6.5 下载地址
    碎片化
    DRM加密技术是怎么一回事
    DRM你又赢了:其API纳入HTML5标准
    java 对视频和图片进行加密解密
    HadoopDB:混合分布式系统
  • 原文地址:https://www.cnblogs.com/shangyu/p/3342918.html
Copyright © 2020-2023  润新知