并查集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;}



0 0