今天比赛的时候做的一个题目。感觉这个题目不错。

题目描述:

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的更多相关文章

  1. ACM:UESTC - 649 括号配对问题 - stack

      UESTC - 649  括号配对问题 Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu ...

  2. UESTC 1015 Lweb and pepper --前,后缀最值

    题意: n种食物,每种含花椒的概率为Pi,现在已经选择了[L,R]这个区间(下标)的食物,要再选一个,使总的食物只有一种含花椒的概率最大,问选哪个最好,相同的选下标小的. 解法: 就不写解法了.此处有 ...

  3. 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2259  Solved: 1023[Submit] ...

  4. UESTC 1852 Traveling Cellsperson

    找规律水题... Traveling Cellsperson Time Limit: 1000ms Memory Limit: 65535KB This problem will be judged ...

  5. UESTC 1851 Kings on a Chessboard

    状压DP... Kings on a Chessboard Time Limit: 10000ms Memory Limit: 65535KB This problem will be judged ...

  6. UESTC 30 最短路,floyd,水

    最短路 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Statu ...

  7. uestc oj 1218 Pick The Sticks (01背包变形)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 给出n根木棒的长度和价值,最多可以装在一个长 l 的容器中,相邻木棒之间不允许重叠,且两边上的木棒,可 ...

  8. uestc oj 1217 The Battle of Chibi (dp + 离散化 + 树状数组)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1217 给你一个长为n的数组,问你有多少个长度严格为m的上升子序列. dp[i][j]表示以a[i]结尾长为j ...

  9. 2015 CCPC D- Pick The Sticks(UESTC 1218) (01背包变形)

    http://acm.uestc.edu.cn/#/problem/show/1218 既然二维dp表示不了,就加一维表示是否在边界放置,放置一个,两个.有一个trick就是如果只放一根,那么多长都可 ...

随机推荐

  1. 运行用例时,报错Unknow Error:Element xxx is not clickable……的解决方法

    P.S:近期selenium官方更新了版本以解决此问题 通常这种情况是由于在点击该元素时,js更换了元素属性造成的. 所以可以采用js的方式进行处理 方法如下: WebDriver driver = ...

  2. python爬虫beautifulsoup4系列1

    前言 以博客园为例,爬取我的博客上首页的发布时间.标题.摘要,本篇先小试牛刀,先了解下它的强大之处,后面讲beautifulsoup4的详细功能. 一.安装 1.打开cmd用pip在线安装beauti ...

  3. c语言数字图像处理(六):二维离散傅里叶变换

    基础知识 复数表示 C = R + jI 极坐标:C = |C|(cosθ + jsinθ) 欧拉公式:C = |C|ejθ 有关更多的时域与复频域的知识可以学习复变函数与积分变换,本篇文章只给出DF ...

  4. 《spark机器学习 第二版》 蔡立宇 分享 pdf下载

    链接:https://pan.baidu.com/s/15Y14eAnfj8zf5mXdixbVeQ 提取码:rkdt

  5. UnityEditor扩展-Shader浏览器

    1. 用途 用于浏览项目所有Shader被使用的情况 2. 界面说明 Ignore Directory:添加不搜索的文件夹,不添加默认搜索全部 Find按钮:开始搜索 Used Shaders:已被使 ...

  6. [Processing]点到线段的最小距离

    PVector p1,p2,n; float d = 0; void setup() { size(600,600); p1 = new PVector(150,30);//线段第一个端点 p2 = ...

  7. 分析(function(window, undefined) {})(window)

    有的时候,我们会在JS框架中看到这行 (function(window, undefined) {})(window) ,它是做什么用的,我们来分析下它 首先这就是一个匿名函数,立即执行它 (func ...

  8. 【Coursera-ML-Notes】线性回归(上)

    什么是机器学习 关于机器学习,有以下两种不同的定义. 机器学习是研究如何使电脑具备学习能力,而不用显式编程告诉它该怎么做. the field of study that gives computer ...

  9. Centos7 zabbix 自动发现与注册

    自动发现与自动注册 自动发现: zabbix Server主动发现所有客户端,然后将客户端登记自己的小本上,缺点zabbix server压力山大(网段大,客户端多),时间消耗多. 自动注册: zab ...

  10. 利用Cocoapods创建基于SVN的私有库podspec

    由于项目年后要进行组件化,考虑到公司内部实现的一些私有组件,不对外公开,而又想在不同项目中使用,该怎么办呢?由于cocoapods有了强大的功能,可以自己创建podspec,更可以设置私有的库.那么利 ...