题目描述

佳佳是个贪玩的孩子。一天,他正在跟凡凡玩“数石子”的游戏。佳佳在地上摆了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
一开始想着把已知的所有线段的两端的数字看成是节点,石子数看成是线段的权值,每次都把大的这一端挂到小的这一端上。
但是这样会出现一个问题,已知1-5,2-5,我们可以知道1-1的值,但是仅仅通过归并之后的树并没有办法直接算出来,在这里可以采取一些处理方式。
把所有的区间变成是左开右闭的区间,这样子的话1-5,2-5就变成了0-5,1-5,合并之后变成了0为根节点的树有两个儿子1和5,这样我们就可以查询1-1和2-5,通过查询同样的左开右闭区间0-1,1-5即可
至于归并的过程就是简单的带权值并查集的归并,无脑写即可
#include <cstdio>
#include <cstring>using namespace std;const int maxn = 50000 + 5;
int fa[maxn],dist[maxn],N,M,K;int f(int a) {if(fa[a] == a) return a;int root = f(fa[a]);dist[a] = dist[a] + dist[fa[a]];fa[a] = root;return root;
}void uni(int a,int b,int d) {a = a - 1;int ya = f(a),yb = f(b);if(ya == yb) return;fa[yb] = a;dist[yb] = d - dist[b];
}int main() {scanf("%d%d%d",&N,&M,&K);for(int i = 1;i <= N;i++) {fa[i] = i;}for(int i = 1;i <= M;i++) {int a,b,d; scanf("%d%d%d",&a,&b,&d);uni(a,b,d);}for(int i = 1;i <= K;i++) {int a,b; scanf("%d%d",&a,&b);a--;int ya = f(a),yb = f(b);if(ya != yb) puts("UNKNOWN");else {printf("%d\n",dist[b] - dist[a]);}}return 0;
}

  

转载于:https://www.cnblogs.com/rolight/p/3840453.html

RQNOJ36 数石子 并查集 简单应用相关推荐

  1. [RQNOJ36]数石子

    题目大意:有N堆石子,每堆含石子个数未知.M个已知条件:[L,R]的区间内共有X个石子,K个问题:[L,R]的区间内共有多少石子?N≤5000 M,K≤10000 Click On 题解 与NOI&l ...

  2. 无向图的连通分支数(并查集)

    目录 这是牛客网上题号为 KY268 的一道题 题目描述:该题的目的是要你统计图的连通分支数. 输入描述:每个输入文件包含若干行,每行两个整数 i, j,表示节点 i 和 j 之间存在一条边. 输出描 ...

  3. Problem 5 素数筛法+并查集

    $des$ 给定一个长度为 $n$ 的正整数序列 ${a_i }$. 将 ${1,2,...,n}$ 划分成两个非空集合 $S.T$,使得 $gcd(\prod_{i \in S} a_i, \pro ...

  4. 并查集+二分-hdu-4750-Count The Pairs

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4750 题目大意: 给一无向图,n个点,m条边,每条边有个长度,且不一样.定义f(i,j)表示从节点i ...

  5. CCPC-Wannafly Winter Camp Day3 (Div2, onsite) I 石头剪刀布(按秩合并并查集)

    题解:每次有两个事件: y y去挑战xx,如果赢了可以坐在x x的位置,打平或者输了就要被淘汰. 询问在进行所有一类事件后,有多少种情况可以让x x现在还没有被淘汰. 对于第二类事件,我们假设x x挑 ...

  6. 【HDOJ6958】KD-Graph(并查集)

    1009 KD-Graph 题意: 给出一张n个点m条边的加权无向图和一个整数K,求一个数字D可以将图分为K组,组内任意两点存在路径且小于等于D,组外不存在小于等于D的路径.不存在D输出-1. 思路: ...

  7. java并查集_一个非常实用而且精妙的算法-并查集(java语言实现)

    在学习数据结构的时候,老师多少会提到并查集,他的应用也是超级广泛.本文首先会通过案例来对并查集有一个介绍.然后给出并查集的java实现. 一.并查集原理 话说在江湖上有很多门派,这些门派相互争夺武林霸 ...

  8. 最小生成树——洛谷并查集、口袋的天空

    最小生成树--并查集 简单模板题-洛谷3367并查集 题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 第一行包含两个整数 N,MN,M ,表示共有 NN 个元素和 MM 个操作 ...

  9. 数据结构-PHP 并查集(Union Find)

    文章目录 数据结构-PHP 并查集(Union Find) 1.并查集示意图 2.并查集合并 3.并查集简单的代码示例 3.1 PHP代码定义 3.2 输出演示 数据结构-PHP 并查集(Union ...

最新文章

  1. java bufferedimage颜色_使用BufferedImage进行渐变色操作
  2. 轻松实现远程批量拷贝文件脚本(女学生作品)
  3. 阻塞IO模型-数据读写
  4. 大王——有趣干货集合
  5. 利用Diskgen找回分区破坏前的资料
  6. 移动端自适应缩放代码
  7. 设计模式01-模板设计模式
  8. LeetCode:Island Perimeter - 岛屿周长
  9. 深入剖析ConcurrentHashMap(2)
  10. Android Studio查看MD5与SHA1
  11. dateutil模块
  12. xp计算机限制打开u盘,处置xp系统电脑限制使用u盘的解决方法
  13. 用C# 设置excel单元格格式
  14. switch服务器维护时间2020,switch pro什么时候出,2020性能加强版switch发布时间
  15. 解决手机提示TF卡受损需要格式化问题
  16. 2017年工作总结--初出茅庐
  17. 敏捷项目用户故事地图
  18. 计算机课 - 计算机科学导论
  19. Linux配置系统网络(动态)
  20. FTP搜索引擎开发文档(任务概述与需求部分)

热门文章

  1. Bootstrap3.0学习第八轮(工具Class)
  2. 五分钟实现网站安全 创新工场“安全宝”吸引大量用户
  3. 中国的城市看多了,贴贴美国的城市,肯定对你的视觉产生冲击
  4. python面试常问题解答_10个Python面试常问的问题
  5. 模拟组合键 postmessage ctrl+v_《模拟江湖》:TapTap热门榜单第一,测试版评分8.0的汉家松鼠工作室新作...
  6. python 爬取_使用 Python 和 BeautifulSoup 来做爬虫抓取
  7. 安装在电脑上的网络测试软件,iperf3 网络测试工具
  8. Tomcat核心架构和启动流程解析
  9. spring高级之AOP详解
  10. JavaScript清空数组的三种方法