UESTC 1832
今天比赛的时候做的一个题目。感觉这个题目不错。
题目描述:
Description
In a laboratory, an assistant, Nathan Wada, is measuring weight differences between sample pieces pair by pair. He is using a balance because it can more precisely measure the weight difference between two samples than a spring scale when the samples have nearly the same weight.
He is occasionally asked the weight differences between pairs of samples. He can or cannot answer based on measurement results already obtained.
Since he is accumulating a massive amount of measurement data, it is now not easy for him to promptly tell the weight differences. Nathan asks you to develop a program that records measurement results and automatically tells the weight differences.
Input
The input consists of multiple datasets. The first line of a dataset contains two integers N and M. N denotes the number of sample pieces (2 <= N <= 100, 000). Each sample is assigned a unique number from 1 to N as an identifier. The rest of the dataset consists of M lines (1 <= M <= 100, 000), each of which corresponds to either a measurement result or an inquiry. They are given in chronological order.
A measurement result has the format,
! a b w
which represents the sample piece numbered b is heavier than one numbered a by w micrograms (a != b). That is, w = wb - wa, where wa and wb are the weights of a and b, respectively. Here, w is a non-negative integer not exceeding 1,000,000.
You may assume that all measurements are exact and consistent.
An inquiry has the format,
? a b
which asks the weight difference between the sample pieces numbered a and b (a != b).
The last dataset is followed by a line consisting of two zeros separated by a space.
Output
For each inquiry, ? a b, print the weight difference in micrograms between the sample pieces numbered a and b, wb - wa, followed by a newline if the weight difference can be computed based on the measurement results prior to the inquiry. The difference can be zero, or negative as well as positive. You can assume that its absolute value is at most 1,000,000. If the difference cannot be computed based on the measurement results prior to the inquiry, print `UNKNOWN' followed by a newline.
Sample Input
2 2
! 1 2 1
? 1 2
2 2
! 1 2 1
? 2 1
4 7
! 1 2 100
? 2 3
! 2 3 100
? 2 3
? 1 3
! 4 3 150
? 4 1
0 0
Sample Output
1
-1
UNKNOWN
100
200
-50
题目的意思是给你n对关系和查询。关系告诉你的是A比B小C,询问的是A比B小多少?
刚看这个题目觉得是个暴力,而且时限开那么宽可以裸过。
后来发现根本不是这么一回事呢。
想了一会儿后就果断的发现这个题目的解法是并查集,对没错就是并查集。
这个题目是带权值的并查集。对于每个节点,除了保存它的父亲节点以外还要保存它与父亲节点的差,这样就能实现同一个集合中任意两个元素的大小比较了。
同时发现,由于对于同一个集合中的每一个元素都是和它的父亲节点做比较,所以整个来说这一个集合是一棵树,所有的集合可以看成是一个森林。
其实题目并不难,思路清楚很容易就写出来了。
可惜我写的时候写挫了一个小地方,wa了若干发,T_T
我的代码,仅供参考,据说效率还不错。
#include <cstdio>
#define maxn 100100
using namespace std; int f[maxn],a[maxn],n,m;
char ch[5]; int father(int x)
{
int ff=f[x];
if (f[x]==x) return x;
f[x]=father(f[x]);
a[x]+=a[ff];
return f[x];
} int main()
{
int A,B,C,f1,f2;
while (scanf("%d%d",&n,&m) && (n+m))
{
for (int i=1; i<=n; i++) f[i]=i,a[i]=0;
while (m--)
{
scanf("%s",ch);
if (ch[0]=='!')
{
scanf("%d%d%d",&B,&A,&C);
f1=father(A);
f2=father(B);
if (f1==f2) continue;
f[f1]=f2;
a[f1]=C+a[B]-a[A];
}
else if (ch[0]=='?')
{
scanf("%d%d",&A,&B);
f1=father(A);
f2=father(B);
if (f1!=f2) puts("UNKNOWN");
else printf("%d\n",a[B]-a[A]);
}
}
}
return 0;
} 题目不难,好好理解这个father中的带权值的路径压缩。
UESTC 1832的更多相关文章
- ACM:UESTC - 649 括号配对问题 - stack
UESTC - 649 括号配对问题 Time Limit: 1000MS Memory Limit: 65535KB 64bit IO Format: %lld & %llu ...
- UESTC 1015 Lweb and pepper --前,后缀最值
题意: n种食物,每种含花椒的概率为Pi,现在已经选择了[L,R]这个区间(下标)的食物,要再选一个,使总的食物只有一种含花椒的概率最大,问选哪个最好,相同的选下标小的. 解法: 就不写解法了.此处有 ...
- 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2259 Solved: 1023[Submit] ...
- UESTC 1852 Traveling Cellsperson
找规律水题... Traveling Cellsperson Time Limit: 1000ms Memory Limit: 65535KB This problem will be judged ...
- UESTC 1851 Kings on a Chessboard
状压DP... Kings on a Chessboard Time Limit: 10000ms Memory Limit: 65535KB This problem will be judged ...
- UESTC 30 最短路,floyd,水
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Statu ...
- uestc oj 1218 Pick The Sticks (01背包变形)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 给出n根木棒的长度和价值,最多可以装在一个长 l 的容器中,相邻木棒之间不允许重叠,且两边上的木棒,可 ...
- uestc oj 1217 The Battle of Chibi (dp + 离散化 + 树状数组)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1217 给你一个长为n的数组,问你有多少个长度严格为m的上升子序列. dp[i][j]表示以a[i]结尾长为j ...
- 2015 CCPC D- Pick The Sticks(UESTC 1218) (01背包变形)
http://acm.uestc.edu.cn/#/problem/show/1218 既然二维dp表示不了,就加一维表示是否在边界放置,放置一个,两个.有一个trick就是如果只放一根,那么多长都可 ...
随机推荐
- 资产管理系统 CMDB 讲解
两年前笔者在一个中小型互联网公司做运维,当时我们经理在机房,花了半天找一台服务器,但是服务器搞错了,悲剧了^.^! 当时我们的做法是用了一个 Excel,很多时候更新不及时,重启一台机器.拔一根网线都 ...
- 安装vs2017后,RDLC 报表定义具有无法升级的无效目标命名空间
原先的RDLC报表定义用的命名空间是2008,用vs2017报表设计器重新保存后,会自动升级成2016,导致无法使用. 不想升级控件,太麻烦,所以就手动修改RDLC文件吧. 1.修改http://sc ...
- 机器学习之利用KNN近邻算法预测数据
前半部分是简介, 后半部分是案例 KNN近邻算法: 简单说就是采用测量不同特征值之间的距离方法进行分类(k-Nearest Neighbor,KNN) 优点: 精度高.对异常值不敏感.无数据输入假定 ...
- PHPCMS增加SEO字段调用
alter table v9_site add site_title_index varchar(255) not null;alter table v9_site add keywords_ind ...
- Swing的概述
Swing在Java中是一个包,下面就是它的基本概述:简介: Java为了方便图形界面的实现, 专门设计了类库来满足各种各样的图形元素和用户交互事件, 该类库即为抽象窗口工具箱(Abstract Wi ...
- Harbor 学习分享系列4 - Harbor常用功能实验
前言 本文为Harbor技术分享系列的第4部分也是初级部分的完结篇,下个阶段作者将会进阶分享,更多详细的内容将会将会在文中介绍. 云盘链接 链接:https://pan.baidu.com/s/1PT ...
- Nginx反向代理负载均衡配置
1.反向代理概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求 ...
- __construct 与 __destruct 区别
其实这个问法是有问题的,__construct 与 __destruct 没什么可比性,两个方法一个在对象被创建的时候触发,另一个在对象被销毁的时候触发 具体可以翻阅PHP官方手册中的 http:// ...
- python基础知识-12-模块的了解
python其他知识目录 1.模块介绍: Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句.模块让你能够有逻辑地组织你 ...
- 随手记录-linux-Linux目录结构
转:别人的 装完Linux,首先需要弄清Linux 标准目录结构 / root —?启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home —?存储普通用户的个人文件 ft ...