并查集PID36 / 数石子
来源:互联网 发布:中国it人才网 编辑:程序博客网 时间:2024/04/30 05:42
PID36 / 数石子 ☆
题目描述
佳佳是个贪玩的孩子。一天,他正在跟凡凡玩“数石子”的游戏。佳佳在地上摆了N堆石子,其中第I堆石子有Ai个石头。佳佳每次都会问凡凡:“凡凡,请问从第I堆到第J堆,总
共有多少个石子?”聪明的凡凡每次都能快速而准确地回答对。凡凡老是被问问题,心里有些不服,就对佳佳说:“佳佳,你还记得你问了什么问题,我回答了什么答案吗?”佳佳说
当然记得。于是凡凡说:“好,我把石子拿走,再问你一些相似的问题,你能答得出来吗?”佳佳张圆了嘴巴,望着凡凡,一脸疑问和惊讶的表情。你现在知道了游戏规则和过程,
但没看见原来的石子。请你写一个程序来帮助佳佳。
数据范围
10%的数据满足1<=n<=10,0<=m,k<=10
30%的数据满足1<=n<=500,0<=m,k<=500
100%的数据满足1<=n<=5000,0<=m,k<=10000
输入格式
输入文件的第一行有3个数N(1<=n<=5000),M,K(0<=m,k<=10000),表示N堆石子,佳佳问了M个问题,凡凡要问K个问题。接下来M行每行3个整数L,R
(1<=l<=r<=n),X(-108<=X<=108),表示佳佳问从L堆到R堆的石子共有多少个,而凡凡回答X个。接下来K行每行2个整数A,B(1<=a<=b<=n),每行表示凡凡问从A
到B这些堆里的石子有多少个。
输出格式
输出文件需要对于凡凡提出每一个提问,你若可以回答,则输出答案,若无法回答,输出UNKNOWN。样例输入
10 5 5
1 5 4
2 5 4
3 6 5
1 9 9
6 6 2
1 9
2 6
1 2
3 5
1 7
样例输出
9
6
1
3
UNKNOWN
分析:注意,将输入(a,b)中的a减去一,对于样例即变成(0,5,4)(1,5,4)(2,6,5)(0,9,9)(5,6,2),注意此处(a,b)距离一定小于等于(a,b+1)的,也就是说(a,b+1)是包含(a,b)的,所以所有石子堆可以构成一棵树。利用带权值并查集即可解决。
#include<cstdio>using namespace std;const int maxn = 50000 + 10;int p[maxn], dist[maxn];//p[x]是记录x的父亲节点,dist[i]是记录x到x的父亲节点距离、x到根的距离(合并、查找)int Find(int x){//查找 if(p[x] == x) return x; int root = Find(p[x]);//递归查找x的父亲节点 dist[x] += dist[p[x]];//将从x到根节点的所有x长辈(父亲、父亲的父亲。。。)节点累加起来,此时dist[x]记录的是x到根节点的距离 return p[x] = root;}void Union(int x, int y, int d){ int x_root = Find(x); int y_root = Find(y); if(x_root != y_root){ p[y_root] = x; dist[y_root] = d - dist[y];//此处dist[y_root]即是y_root到它父亲节点的距离(注意此处后面石头堆个数/距离不一定一定比前面多/大,可能出现负值) }}int main(){ int n, m, k, a, b ,d; scanf("%d%d%d", &n, &m, &k); for(int i = 0; i <= n; i++){ p[i] = i; dist[i] = 0;//初始化数组(数组dist默认即为0,此处未涉及多组输入可以省去) } for(int i = 0; i < m; i++){ scanf("%d%d%d", &a, &b, &d); a--;//将a减一 Union(a, b, d); } for(int i = 0; i < k; i++){ scanf("%d%d", &a, &b); a--;//将a减一 if(Find(b) == Find(a))//如果a,b是连通的,即可以知道距离 printf("%d\n", dist[b] - dist[a]); else printf("UNKNOWN\n"); } return 0;}
- 并查集PID36 / 数石子
- RQNOJ PID36 数石子
- 产生数(并查集)
- poj2985线段树求第k大的数(并查集)
- 并查集+treap实现名次数(BZOJ2733)
- HDU 5326 多维数组接法 【并查集】
- Networking(并查集&&最小生成数)
- POJ 1611 记录节点数的并查集
- 查入一个数,并排序
- HDU3938 并查集 并查集
- 并查集(集并查)
- HDU1232 并查集<并>
- 并查集
- 数据结构-并查集
- 并查集
- 并查集!
- 并查集
- 并查集
- Eclipse上GIT插件EGIT使用手册
- 苹果开发者账号注册流程
- 获取GIAC GSEC,GSLC,GSSP-Java认证测试
- linux 下 apache2和subverion的通用安装和配置(无权限)
- 获取最新职位通过在线作业分类
- 并查集PID36 / 数石子
- 学习Weblogic和JAVA的一些笔记-Xms Xmx PermSize MaxPermSize的含义
- Tomcat中Connector常用配置
- Bull Math(高精度)
- Linux 下IPV6配置
- 蓝光卷烟回顾为什么是蓝的CIGS热
- ORACLE 更新插入数据
- Java中如何使封装自己的类,建立并使用自己的类库?
- OSI七层模型与TCP/IP五层模型