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

转载于:https://www.cnblogs.com/shangyu/p/3342918.html

1003. Parity(并查集)相关推荐

  1. Ural_1003 Parity(并查集)

    /*发现并查集的应用太巧妙了...大体思路:从题中可以看出来如果(i, j)是even的话,sum(i-1) 和 sum(j)的奇偶性相同.(i, j)如果是odd的话则其奇偶行不同.定义奇偶性为朋友 ...

  2. 2017百度之星程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】...

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  3. P5937 [CEOI1999]Parity Game-扩展域并查集与离散化处理

    题目链接[CEOI1999]Parity Game - 洛谷 单调队列优化多重背包(全网最详细解析)_秦三马和他的CF生涯的博客-CSDN博客 考察内容,扩展域并查集,本题中把奇偶性相同归为一个集合, ...

  4. [POJ1733]Parity game(并查集 + 离散化)

    传送门 题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的 思路:如果我们知道[1,2][3,4][5,6]区间的信息,我们可以求出[1,6] ...

  5. 并查集——奇偶性(Parity)

    题目描述 • 有一个 01 序列 , 长度 <=1000000000, 现在有 n 条 信息 , 每条信息的形式是- a b even/odd .表示 第 a 位到第 b 位元素之间的元素总和是 ...

  6. Parity(带权值的并查集)

    你的朋友写下一串包含1和0的串让你猜,你可以从中选择一个连续的子串(例如其中的第3到第5个数字)问他,该子串中包含了奇数个还是偶数个1,他会回答你的问题,然后你可以继续提问......你怀疑朋友的答案 ...

  7. POJ 并查集 题目汇总 ——czyuan原创(转)

    继续数据结构的复习,本次的专题是:并查集. 并查集,顾名思义,干的就是"并"和"查"两件事.很多与集合相关的操作都可以用并查集高效的解决. 两个操作代码:    ...

  8. 【加权并查集】bzoj 4602 齿轮

    立志用最少的代码做最高效的表达 Description 现有一个传动系统,包含了N个组合齿轮和M个链条.每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x : y.即如果只考虑这两个组合齿轮,编 ...

  9. 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

最新文章

  1. SQL Server 重置SA密码语句
  2. java nio 应用场景_BIO、NIO、AIO简述及应用场景
  3. supersocket缓冲区_supersockets接收过滤器(ReceiveFilter)
  4. 工作30:加入git版本库
  5. python xlwt操作excel
  6. C++Builder2010创建线程
  7. C# 中的 ConfigurationManager类引用方法应用程序配置文件App.config的写法
  8. SpringBoot 整合 liquibase
  9. 用户与系统(unix)
  10. 《EDIUS 6.5快刀手高效剪辑技法》——1.5 常用视频术语简介
  11. 圈子圈套 pdf_名字叫什么? 如何圈套好域名
  12. Azure Tools---CAT(一)
  13. Linux登录mysql密码正确被拒绝访问
  14. Disturbed People CodeForces - 1077B
  15. cesium获取模型高度_180套经典夹具设计方案(附详解+模型),原来夹具设计这么简单!...
  16. k8s replicaset controller源码分析(1)- 初始化与启动分析
  17. Ensiko:含有勒索软件功能的Webshell
  18. Gulp——JS模块化说明视频-张晓飞-专题视频课程
  19. EAUML日拱一卒-微信小程序实战:位置闹铃 (14)-分析监控点状态
  20. 掌握这十个Linux命令,秒变Linux老手

热门文章

  1. 软件工程师的技能知识图谱0.1(偏后台方向)
  2. Unity3D实践1.1:解决摄像机跟随中的视野遮挡问题
  3. Unity3D切换场景之后光源失效(物体变暗)问题
  4. Unity3D基础11:Rigidbody物理类组件
  5. 2017百度之星初赛:B-1001. Chess
  6. 边与最小割(bzoj 1797: [Ahoi2009]Mincut 最小割)
  7. cube一站式云原生机器学习平台-推理服务的工程化加速
  8. python机器学习案例系列教程——聚类算法总结
  9. 01-操作数组的方法
  10. How to manage concurrency in Django models