hdu 3047(扩展并查集)
2016-05-10 20:05
183 查看
Zjnu Stadium
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2672 Accepted Submission(s): 1028
[align=left]Problem Description[/align]
In
12th Zhejiang College Students Games 2007, there was a new stadium
built in Zhejiang Normal University. It was a modern stadium which
could hold thousands of people. The audience Seats made a circle. The
total number of columns were 300 numbered 1--300, counted clockwise, we
assume the number of rows were infinite.
These days, Busoniya want
to hold a large-scale theatrical performance in this stadium. There will
be N people go there numbered 1--N. Busoniya has Reserved several
seats. To make it funny, he makes M requests for these seats: A B X,
which means people numbered B must seat clockwise X distance from
people numbered A. For example: A is in column 4th and X is 2, then B
must in column 6th (6=4+2).
Now your task is to judge weather the
request is correct or not. The rule of your judgement is easy: when a
new request has conflicts against the foregoing ones then we define it
as incorrect, otherwise it is correct. Please find out all the
incorrect requests and count them as R.
[align=left]Input[/align]
There are many test cases:
For every case:
The first line has two integer N(1<=N<=50,000), M(0<=M<=100,000),separated by a space.
Then M lines follow, each line has 3 integer A(1<=A<=N), B(1<=B<=N), X(0<=X<300) (A!=B), separated by a space.
[align=left]Output[/align]
For every case:
Output R, represents the number of incorrect request.
[align=left]Sample Input[/align]
10 10
1 2 150
3 4 200
1 5 270
2 6 200
6 5 80
4 7 150
8 9 100
4 8 50
1 7 100
9 2 100
[align=left]Sample Output[/align]
2
题意:就是一个无限大的场地里面坐了很多人,每两个人之间都有一个距离。如果后面的描述和前面的冲突,那么则认为这条是错误的。问总共有多少条错误的描述。
题解:向量偏移的并查集。详细了解可以参考我的博客:http://www.cnblogs.com/liyinggang/p/5327055.html
我们设某个点到根节点的距离a->root为sum[a],然后套用公式就OK
当描述的两个人已经位于同一棵子树了
a->b = a->root - b->root
还没有位于同一棵子树时
roota ->rootb = b->rootb + a->b - a->roota
方向千万不要搞错。
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; const int N =50001; int father ; int sum ; ///记录当前结点到根结点的距离 int _find(int x){ if(x!=father[x]){ int t = father[x]; father[x] = _find(father[x]); sum[x]+=sum[t]; } return father[x]; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=0;i<=n;i++){ father[i] = i; sum[i] = 0; } int ans = 0; while(m--){ int a,b,v; scanf("%d%d%d",&a,&b,&v); int roota = _find(a); int rootb = _find(b); if(roota==rootb){ if(sum[a]-sum[b]!=v) ans++; } else{ father[roota] = rootb; sum[roota] = -sum[a]+sum[b]+v; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- websocket
- linkly seqlock rcu
- JAVA_SE线程实现两种方式实例
- leetcode_322 Coin Change
- 第十一周项目—阅读程序,说出在测试函数中不同情况的调用产生的结果(5 b)
- 31.第一个只出现一次的字符位置
- 对面向对象简单的理解
- Python中使用SQLAlchemy连接Mysql数据库3(事务,编码)
- 设计模式(Design Patterns)
- Strassen矩阵乘法算法实现
- CTSC && APIO 行程记录
- 不同版本的散点图矩阵
- bzoj 1003(spfa+dp)
- Spring事务学习总结
- angular中的transclude详解
- python数据类型
- Highlighter与BooleanQuery查询
- 欢迎使用CSDN-markdown编辑器
- C++实验5--1数组分离
- android中原始数据库创建与框架的对比,建表三范式的理解