n<=100000条相等/不等关系描述<=100000个数,把这些数据分割成若干段使得每一段描述都出现冲突且冲突只出现在最后一行。

相等关系具有传递性,并查集维护;不等关系根据相等关系进行合并,采用平衡树的启发式合并。

每次遇到相等关系x,y,先找到x,y对应并查集的根p,q,判是否p在q的不等关系中,若否说明成立,这时应合并并查集,并合并两棵平衡树,小的合到大的上。

每次遇到不等关系x,y,先找到x,y对应并查集的根p,q,判是否p和q在同一个并查集中,若否说明成立,这时应把p和q分别添加到对方的平衡树中。

平衡树调用set即可。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<set>
 7 //#include<iostream>
 8 using namespace std;
 9
10 int T,n=200001;
11 #define maxn 200011
12 set<int> s[maxn];
13 int cnt,vis[maxn],sta[maxn],top;
14 struct UFS
15 {
16     int fa[maxn];
17     UFS() {for (int i=1;i<=n;i++) fa[i]=i;}
18     int find(int x) {return x==fa[x]?x:(fa[x]=find(fa[x]));}
19     void Union(int &x,int &y)
20     {
21         x=find(x),y=find(y);
22         if (x!=y) fa[x]=y;
23     }
24 }ufs;
25 int x,y,id;
26 int ans[maxn],lans=0,Case;
27 void clear()
28 {
29     while (top)
30     {
31         int now=sta[top--];
32         ufs.fa[now]=now;
33         s[now].clear();
34     }
35     ans[cnt++]=Case;
36 }
37 int main()
38 {
39     scanf("%d",&T);
40     memset(vis,0,sizeof(vis));
41     top=0;cnt=1;
42     for (Case=1;Case<=T;Case++)
43     {
44         scanf("%d%d%d",&x,&y,&id);
45         if (vis[x]!=cnt) vis[x]=cnt,sta[++top]=x;
46         if (vis[y]!=cnt) vis[y]=cnt,sta[++top]=y;
47         x=ufs.find(x),y=ufs.find(y);
48         if (s[x].size()>s[y].size()) {int t=x;x=y;y=t;}
49         if (id)
50         {
51             if (s[x].find(y)!=s[x].end())
52             {
53                 clear();
54                 continue;
55             }
56             ufs.Union(x,y);
57             for (set<int>::iterator i=s[x].begin();i!=s[x].end();i++)
58             {
59                 int now=*i;now=ufs.find(now);
60                 s[now].erase(x);
61                 s[y].insert(now);
62                 s[now].insert(y);
63             }
64             s[x].clear();
65         }
66         else
67         {
68             if (x==y)
69             {
70                 clear();
71                 continue;
72             }
73             s[x].insert(y);
74             s[y].insert(x);
75         }
76     }
77     printf("%d\n",cnt-1);
78     for (int i=1;i<cnt;i++) printf("%d\n",ans[i]-ans[i-1]);
79     return 0;
80 }

View Code

转载于:https://www.cnblogs.com/Blue233333/p/7352289.html

2017百度之星程序设计大赛 - 初赛(A)数据分割相关推荐

  1. HDU 6114 Chess 【组合数】(2017百度之星程序设计大赛 - 初赛(B))

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  2. [SinGuLaRiTy] 2017 百度之星程序设计大赛 初赛A

    [SinGuLaRiTy-1036] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 小C的倍数问题 Time Limit: 2000/100 ...

  3. HDU 6108.小C的倍数问题 (2017百度之星程序设计大赛 - 初赛(A)1001)

    补完题?不存在的. 这么久了,还是一条咸鱼,看一堆乱七八糟的东西,写一堆没用的水题,一点进步都没有,还是那么菜,菜的掉渣. 这个百毒之星初赛A还会写两道最简单的水题,初赛B一点也不会,菜的难过... ...

  4. 2017百度之星程序设计大赛 - 初赛(A)今夕何夕

    Problem Description 今天是2017年8月6日,农历闰六月十五. 小度独自凭栏,望着一轮圆月,发出了"今夕何夕,见此良人"的寂寞感慨. 为了排遣郁结,它决定思考一 ...

  5. 【2017百度之星程序设计大赛 - 初赛(B)】度度熊的交易计划

    [链接]点击打开链接 [题意] 在这里写题意 [题解] 先设一个超级源点,向每个片区都建一条边,容量为b,费用为-a; 然后从每个片区再连一条边,指向一个超级汇点. 容量为d,费用为c; 然后从起点到 ...

  6. hdu6383(2018 “百度之星”程序设计大赛 - 初赛(B))

    p1m2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Sub ...

  7. hdu6380(2018 “百度之星”程序设计大赛 - 初赛(B))

    degree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total S ...

  8. hdu6375(2018 “百度之星”程序设计大赛 - 初赛(A))

    度度熊学队列 Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total S ...

  9. 2017百度之星程序设计大赛 - 复赛 01,03,05

    Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

最新文章

  1. 2022-2028年中国PE膜产业竞争现状及发展前景分析报告
  2. 如何让Table显示滚动条
  3. 【119】开始学习CMD
  4. MySQL 不完全入门指南
  5. 鞋企立足信息化建设 力争突破发展瓶颈
  6. poj 2777 Count Color
  7. 认识less和webstrom的less配置
  8. SO_REUSEADDR和SO_REUSEPORT
  9. ASP.NET MVC (四、ASP.NET Web API应用程序与跨域操作)
  10. 2018年对PHP的新认知
  11. android wifi 通讯录,通过wifi和gmail从symbian手机中将名片夹(通讯录)导入到android手机 | 古意人...
  12. 【转】WPF Expander 收缩不占空间的用法
  13. 扫描仪 pfu_行业案例:扫描仪高效加持下的艺术工作室
  14. php magic quotes 选项为 on,PHP:当Magic Quotes为ON时,如何(正确)删除数组中的转义引号...
  15. Chrome 插件开发与本地程序交互流程
  16. 前端与游戏前端unityUI比较
  17. Python常用模块库下载及安装
  18. windows 一键切换ip dns脚本
  19. 超级炫酷的3D旋转美女图——Python实现
  20. 解决50%宽度div再加上边框无法左右排列问题

热门文章

  1. 详解DPoS共识算法
  2. android源码settings中显示所有正在运行进程流程分析
  3. Android Studio 本机调试
  4. lisp xy轴不等比缩放_不就是用Python做个动态图吗?看招
  5. oracle 连续5分钟_3-1!10分钟3球杀入前四,连续5个客场大逆转,名字叫曼联
  6. android socket 长连接_php socket如何实现长连接
  7. JZOJ 5460. 【NOIP2017提高A组冲刺11.7】士兵训练
  8. JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列
  9. server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...
  10. Qt 清空QPixMap