题目链接:https://cn.vjudge.net/problem/HDU-6109

题意

给出多组等式不等式

对于每一个式子,首先判断是否不可能

如果不可能,记录本组正确式子的个数,然后进入下一组式子

思路

一开始还以为是食物链,等到写出来WA了才发现不等号不能传递(注意并查集的传递性了)

然后决定用一个set存下所有不等边,事后发现一个set难以维护和查询

最后实在不行看了题解,发现只要用一个类似线段树的PushUp来维护根节点的不等情况就好,真是一个好思路啊学习了

代码

#include <set>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=int(1e5);
struct Node{
int pre, rank;
Node(int pre=0, int rank=0):
pre(pre), rank(rank) {}
}node[maxn+5];
set<int> diff[maxn+5];
int n, m;
int kase=0, cnt=0, ptr=0, num[maxn+5]={0};
int find(int x){
return (node[x].pre==x)?x:(node[x].pre=find(node[x].pre));
} void pushup(int nod, int root){
for (set<int>::iterator it=diff[nod].begin(); it!=diff[nod].end(); it++)
diff[root].insert(*it);
} void join(int a, int b){
a=find(a); b=find(b);
if (a==b) return;
if (node[a].rank==node[b].rank) node[a].rank++;
if (node[a].rank>node[b].rank) {node[b].pre=a; pushup(b, a);}
else {node[a].pre=b; pushup(a, b);}
} inline void split(void){
for (int i=0; i<=maxn; i++){
diff[i].clear();
node[i]=Node(i, 0);
}
num[ptr++]=cnt;
kase++; cnt=0;
} int main(void){
int l, a, b, equal;
scanf("%d", &l); for (int i=0; i<=maxn; i++){
diff[i].clear();
node[i]=Node(i, 0);
}
while (l--){
cnt++;
scanf("%d%d%d", &a, &b, &equal);
a=find(a); b=find(b);
if (!equal){
if (a==b) {split(); continue;}
diff[a].insert(b); diff[b].insert(a);
}else{
if (diff[a].count(b) || diff[b].count(a)) {split(); continue;}
join(a, b);
}
}printf("%d\n", kase);
for (int i=0; i<ptr; i++) printf("%d\n", num[i]); return 0;
}
Time Memory Length Lang Submitted
109ms 8200kB 1499 G++ 2018-03-21 14:54:04

最新文章

  1. asp.net 读取导入的project(mpp)文件
  2. Qt for Mac 安装(包括PyQt)
  3. ubuntu16.04 + ubuntu + apache2 配置apache解析php
  4. AngularJS内置指令
  5. HDU1011 树形DP
  6. ASP.NET MVC 学习1、新增Controller,了解MVC运行机制
  7. poj-3056 http://poj.org/problem?id=3056
  8. python的hashlib模块
  9. (五):C++分布式实时应用框架——微服务架构的演进
  10. UWP关于图片缓存的那些破事儿
  11. 一个GD初二蒟蒻的自我介绍
  12. elasticsearch以及head插件在centos7上的安装与配置教程
  13. str 转 md5
  14. LVM : 简介
  15. IEnumerable&lt;T&gt; list注意事项
  16. list泛型转换成datatable
  17. es6笔记(4) Set数据结构
  18. Intellij IDEA连接Spark集群
  19. epoll详细工作原理(转)
  20. config的配置文件

热门文章

  1. Go语言结构体转json的坑
  2. CreateProcess
  3. 移动端 input 获取焦点后弹出带enter(类似于搜索,确定,前往)键盘,以及隐藏系统键盘
  4. Android TextView加上阴影效果
  5. SQLServer 错误: 15404,维护计划无法执行
  6. Swift 中的协议
  7. eclipse界面更改为黑色
  8. iOS开发——AFNetworking基于https的使用
  9. BZOJ 2865 字符串识别(后缀数组+线段树)
  10. BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)