bzoj 3712: [PA2014]Fiolki
Description
化学家吉丽想要配置一种神奇的药水来拯救世界。
吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号)。初始时,第i个瓶内装着g[i]克的第i种物质。吉丽需要执行一定的步骤来配置药水,第i个步骤是将第a[i]个瓶子内的所有液体倒入第b[i]个瓶子,此后第a[i]个瓶子不会再被用到。瓶子的容量可以视作是无限的。
吉丽知道某几对液体物质在一起时会发生反应产生沉淀,具体反应是1克c[i]物质和1克d[i]物质生成2克沉淀,一直进行直到某一反应物耗尽。生成的沉淀不会和任何物质反应。当有多于一对可以发生反应的物质在一起时,吉丽知道它们的反应顺序。每次倾倒完后,吉丽会等到反应结束后再执行下一步骤。
吉丽想知道配置过程中总共产生多少沉淀。
Input
第一行三个整数n,m,k(0<=m<n<=200000,0<=k<=500000),分别表示药瓶的个数(即物质的种数),操作步数,可以发生的反应数量。
第二行有n个整数g[1],g[2],…,g[n](1<=g[i]<=10^9),表示初始时每个瓶内物质的质量。
接下来m行,每行两个整数a[i],b[i](1<=a[i],b[i]<=n,a[i]≠b[i]),表示第i个步骤。保证a[i]在以后的步骤中不再出现。
接下来k行,每行是一对可以发生反应的物质c[i],d[i](1<=c[i],d[i]<=n,c[i]≠d[i]),按照反应的优先顺序给出。同一个反应不会重复出现。
Output
Sample Input
2 3 4
1 2
3 2
2 3
Sample Output
HINT
Source
jesseliu的讲课题,思路和Kruskal重构树的思想比较像。。。
因为每个瓶子倒进一个瓶子之后就废了,那么每个瓶子只有唯一的父亲,那么倾倒操作构成了树结构。。。
然后我们用Peaks类似的方法,把两个瓶子合起来的时候新建一个点表示合并后的瓶子。。。
这样做的好处就是可以维护好每个瓶子内的化学用品还剩多少,因为合并不影响原来瓶子的信息。。。
然后两个反应物相遇的时间就是其Lca的深度,反应的优先级就是序号,
那么我们按照其Lca为第一关键字,反应的优先级为第二关键字排序,然后依次处理反应即可。。。
- // MADE BY QT666
- #include<cstdio>
- #include<algorithm>
- #include<cmath>
- #include<iostream>
- #include<cstring>
- using namespace std;
- typedef long long ll;
- const int N=2000050;
- int fa[N],g[N],dfn[N],n,m,k,tt,tot;
- int head[N],to[N],nxt[N],cnt;
- int size[N],son[N],deep[N],tmp,top[N],father[N];
- void lnk(int x,int y){
- to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
- to[++cnt]=x,nxt[cnt]=head[y],head[y]=cnt;
- }
- void dfs1(int x,int f){
- size[x]=1;deep[x]=deep[f]+1;
- for(int i=head[x];i;i=nxt[i]){
- int y=to[i];if(y==f) continue;
- dfs1(y,x);father[y]=x;size[x]+=size[y];
- if(size[y]>size[son[x]]) son[x]=y;
- }
- }
- void dfs2(int x,int f){
- top[x]=f;dfn[x]=++tmp;
- if(son[x]) dfs2(son[x],f);
- for(int i=head[x];i;i=nxt[i]){
- int y=to[i];
- if(y==father[x]||y==son[x]) continue;
- dfs2(y,y);
- }
- }
- int Lca(int x,int y){
- while(top[x]!=top[y]){
- if(deep[top[x]]<deep[top[y]]) swap(x,y);
- x=father[top[x]];
- }
- if(deep[x]<deep[y]) swap(x,y);
- return y;
- }
- struct data{
- int x,y,Lca,id;
- }q[N];
- bool cmp(const data &a,const data &b){
- if(deep[a.Lca]==deep[b.Lca]) return a.id<b.id;
- return deep[a.Lca]>deep[b.Lca];
- }
- int find(int x){
- if(x!=fa[x]) fa[x]=find(fa[x]);
- return fa[x];
- }
- int main(){
- scanf("%d%d%d",&n,&m,&k);tt=n;
- for(int i=1;i<=n;i++) scanf("%d",&g[i]);
- for(int i=1;i<=n;i++) fa[i]=i;
- for(int i=1;i<=m;i++){
- int x,y;scanf("%d%d",&x,&y);
- tt++;x=find(x),y=find(y);
- lnk(tt,x);lnk(tt,y);fa[x]=fa[y]=tt;fa[tt]=tt;
- }
- for(int i=1;i<=tt;i++) if(find(i)==i) dfs1(i,0),dfs2(i,i);
- for(int i=1;i<=k;i++){
- int x,y;scanf("%d%d",&x,&y);
- if(find(x)==find(y)) q[++tot]=(data){x,y,Lca(x,y),i};
- }
- sort(q+1,q+1+tot,cmp);ll ans=0;
- for(int i=1;i<=tot;i++){
- int res=min(g[q[i].x],g[q[i].y]);
- g[q[i].x]-=res,g[q[i].y]-=res,ans+=1ll*(res<<1);
- }
- printf("%lld\n",ans);
- return 0;
- }
bzoj 3712: [PA2014]Fiolki的更多相关文章
- BZOJ 3712: [PA2014]Fiolki 倍增+想法
3712: [PA2014]Fiolki Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 437 Solved: 115[Submit][Status ...
- 【BZOJ】3712: [PA2014]Fiolki
http://www.lydsy.com/JudgeOnline/problem.php?id=3712 题意:n个瓶子,第i个瓶子里又g[i]克物质.m次操作,第i次操作把第a[i]个瓶子的东西全部 ...
- [PA2014]Fiolki
[PA2014]Fiolki 题目大意: 有\(n(n\le2\times10^5)\)种不同的液体物质和\(n\)个容量无限的药瓶.初始时,第\(i\)个瓶内装着\(g_i\)克第\(i\)种液体. ...
- BZOJ 3721: PA2014 Final Bazarek
3721: PA2014 Final Bazarek Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 645 Solved: 261[Submit][ ...
- BZOJ 3709: [PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1050 Solved: ...
- 【贪心】bzoj 3709:[PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 653 Solved: ...
- BZOJ 3713: [PA2014]Iloczyn( 枚举 )
斐波那契数列<10^9的数很少很少...所以直接暴力枚举就行了... ------------------------------------------------------------- ...
- bzoj 3714 [PA2014]Kuglarz 最小生成树
[PA2014]Kuglarz Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1335 Solved: 672[Submit][Status][Di ...
- bzoj 3722: PA2014 Final Budowa
3722: PA2014 Final Budowa Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 303 Solved: 108[Submit][St ...
随机推荐
- 详解卷积神经网络(CNN)在语音识别中的应用
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:侯艺馨 前言 总结目前语音识别的发展现状,dnn.rnn/lstm和cnn算是语音识别中几个比较主流的方向.2012年,微软邓力和俞栋老 ...
- css一些简单的例子
1.http协议 一:HTTP协议:hypertext transport protocol(超文本传输协议) 特点: 1.请求与响应 2.无状态的协议 请求协议: 请求首行: 请求头信息: Acce ...
- [特斯拉组件]ios高性能PageController
本文来自于腾讯Bugly公众号(weixinBugly),作者:sparrowchen,未经作者同意,请勿转载,原文地址: http://mp.weixin.qq.com/s/hBgvPBP12IQ1 ...
- Cracking the Coding Interview 题目分析笔记—— Array and String
1.Determine if a string has all unique characters learn: 为了减少空间利用率,其比较优秀的算法一般都适用位操作 返回值的命名方法,我们需要学习 ...
- [P4基础]p4app的Docker镜像仓使用详解
How to use the p4lang/p4app Docker image 本文参考 孙勇峰博客 和 p4app README 以及 p4app Dockerfile 结合自己的理解做一些记录, ...
- Asp.Net下,基于Jquery的Ajax二级联动
最近做一个项目,要求实现二级联动效果.背景为:通过学院的选择,联动出专业选项.起初想直接用微软的控件实现Ajax效果,但是DropDownList控件会自动触发PostBack,在后台根本就不好控制, ...
- javaScript 验证码 倒计时60秒
<input type="button" id="btn" value="免费获取验证码" /> <script type ...
- Android注解方式实现表单校验
在开发中总会遇到输入框的输入规则限制 比如 电话输入框电话号码的校验,密码规则的校验等 ,我们通常做法是提交操作时对每个输入框的输入内容进行校验,很多的if else ,代码看起来很乱,其实我们可以用 ...
- linux mysql定时备份
项目需要定时备份数据库,以下是自己的操作笔记 1.检查磁盘空间 # df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G 3.6 ...
- js onmouseover与onmouseout用法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...