数据分割

小w来到百度之星的赛场上,准备开始实现一个程序自动分析系统。

这个程序接受一些形如x_i = x_jx​i​​=x​j​​ 或 x_i \neq x_jx​i​​≠x​j​​ 的相等/不等约束条件作为输入,判定是否可以通过给每个 w 赋适当的值,来满足这些条件。

输入包含多组数据。 然而粗心的小w不幸地把每组数据之间的分隔符删掉了。 他只知道每组数据都是不可满足的,且若把每组数据的最后一个约束条件去掉,则该组数据是可满足的。

请帮助他恢复这些分隔符。

Input

第11行:一个数字LL,表示后面输入的总行数。

之后LL行,每行包含三个整数,i,j,ei,j,e,描述一个相等/不等的约束条件,若e=1e=1,则该约束条件为x_i = x_jx​i​​=x​j​​ ,若e=0e=0,则该约束条件为 x_i \neq x_jx​i​​≠x​j​​ 。

i,j,L \leq 100000i,j,L≤100000

x_i , x_j \leq Lx​i​​,x​j​​≤L

Output

输出共T+1T+1行。

第一行一个整数TT,表示数据组数。

接下来TT行的第ii行,一个整数,表示第i组数据中的约束条件个数。

Sample Input
6
2 2 1
2 2 1
1 1 1
3 1 1
1 3 1
1 3 0
Sample Output
1
6
———————————————————————————————————————
因为相等具有传递性所以我们可以用并查集维护一波
但是不等于不具有传递性所以我们可以用平衡树维护一波
当然这里我用的是set
这样之后呢 等于我们就可以把他们扔在一个并查集里面
不等于的就把不等于他的扔进他的平衡树里面
每次询问
如果是一对相等的数
我们就找一波他们是否在同一个并查集里 是就直接继续下一波
不是就找他们是否存在对方的平衡树里面 当然这里我们强行把size小的合并进大的里面保证复杂度
如果是不相等就判断他们是否同属一个并查集
是就清空一波 记录答案
不然就把他们加入对方的平衡树里面
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int T,f[];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
set<int>tr[];
int vis[],cnt=;
int ans[],ap;
int stk[],stp;
int a,b,h;
void clear(){
while(stp){
int x=stk[--stp];
tr[x].clear();
f[x]=x;
}
++cnt;
}
int main()
{
T=read();
for(int i=;i<=;i++) f[i]=i;
for(int i=;i<=T;i++){
a=read(); b=read(); h=read();
if(vis[a]!=cnt) stk[stp++]=a,vis[a]=cnt;
if(vis[b]!=cnt) stk[stp++]=b,vis[b]=cnt;
int p=find(a),q=find(b);
if(tr[p].size()<tr[q].size()) swap(p,q);
if(h==){
if(p==q) continue;
if(tr[p].find(q)!=tr[p].end()){
clear();
ans[++ap]=i;
continue;
}
f[q]=p;
for(set<int>::iterator it=tr[q].begin();it!=tr[q].end();it++){
int z=*it;
tr[z].erase(q);
tr[z].insert(p);
tr[p].insert(z);
}
tr[q].clear();
}
else{
if(p==q){
clear();
ans[++ap]=i;
continue;
}
tr[p].insert(q);
tr[q].insert(p);
}
}
printf("%d\n",ap);
for(int i=;i<=ap;i++) printf("%d\n",ans[i]-ans[i-]);
return ;
}

最新文章

  1. C#-WebForm-纯HTML提交方式
  2. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程
  3. mysql导出表数据
  4. Unity(三)依赖注入
  5. LeetCode之LRU Cache 最近最少使用算法 缓存设计
  6. php中数据库的操作
  7. Web.config之连接字介绍
  8. entity framework in mysql
  9. POJ3083 Children of the Candy Corn(搜索)
  10. HTML5 3D翻书效果(双面效应)
  11. 九度OJ 1014 排名
  12. 利用python实现简单随机验证码
  13. java 多线程 synchronized与lock的通信机制等问题,结合相应实例说明
  14. [Swift]LeetCode494. 目标和 | Target Sum
  15. 【转】 多线程之linux线程调度策略
  16. 23.模拟登录cookies请求速询网站数据
  17. Java命令学习系列(四)——jstat
  18. Direct2D教程V——位图(Bitmap)和位图笔刷(BitmapBrush)
  19. Fifteen scrum meeting 2015-11-21
  20. 深入了解Node模块原理

热门文章

  1. 简单php实现同一时间内一个账户只允许在一个终端登陆
  2. 【yii2】 yii框架如果控制器和方法都是多个单词组成应该怎样写请求链接
  3. Zookeeper+Kafka的单节点配置
  4. storm实时计算实例(socket实时接入)
  5. Oozie 之 sqoop 实战
  6. 什么情况使用 weak 关键字,相比 assign 有什么不同?
  7. 《Cracking the Coding Interview》——第17章:普通题——题目10
  8. 《Cracking the Coding Interview》——第1章:数组和字符串——题目2
  9. 23、php知识点总结基础教程--part-1
  10. HTML简易学习笔记