http://www.lydsy.com/JudgeOnline/problem.php?id=3712

题意:n个瓶子,第i个瓶子里又g[i]克物质。m次操作,第i次操作把第a[i]个瓶子的东西全部倒到第b[i]个瓶子里(保证之后不出现a[i])。k种反应,其中c[i]和d[i]反应,而且如果一个瓶子里有多种反应则优先反应靠前的。每次反应对答案贡献为min(g[i], g[i])*2(m<n<=200000, k<=500000)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200005, M=200005, nQ=500005;
ll ans;
int n, m, K, ihead[N+M], cnt, pos[N], g[N], dep[N+M], f[N+M][20], tot;
struct E { int next, to; } e[(N+M)<<1];
struct Q { int x, y, ff, dep, id; } q[nQ];
bool cmp(const Q &a, const Q &b) {
return a.dep==b.dep?a.id<b.id:a.dep>b.dep;
}
void add(int x, int y) {
e[++cnt]=(E){ihead[x], y}; ihead[x]=cnt;
e[++cnt]=(E){ihead[y], x}; ihead[y]=cnt;
}
void dfs(int x) {
for(int i=1; i<=19; ++i) f[x][i]=f[f[x][i-1]][i-1];
for(int i=ihead[x]; i; i=e[i].next) if(e[i].to!=f[x][0]) { f[e[i].to][0]=x; dep[e[i].to]=dep[x]+1; dfs(e[i].to); }
}
int lca(int x, int y) {
if(dep[x]<dep[y]) swap(x, y);
int d=dep[x]-dep[y];
for(int i=19; i>=0; --i) if((d>>i)&1) x=f[x][i];
if(x==y) return x;
for(int i=19; i>=0; --i) if(f[x][i]!=f[y][i]) x=f[x][i], y=f[y][i];
return f[x][0];
}
int main() {
scanf("%d%d%d", &n, &m, &K);
for(int i=1; i<=n; ++i) pos[i]=i;
for(int i=1; i<=n; ++i) scanf("%d", &g[i]);
for(int i=1; i<=m; ++i) { int a, b; scanf("%d%d", &a, &b); int ff=n+i; add(pos[a], ff); add(pos[b], ff); pos[b]=ff; }
for(int i=n+m; i>=1; --i) if(!f[i][0]) dfs(i);
for(int i=1; i<=K; ++i) { int a, b, ff; scanf("%d%d", &a, &b); ff=lca(a, b); if(!ff) continue; q[tot++]=(Q){a, b, ff, dep[ff], tot}; }
sort(q, q+tot, cmp);
for(int i=0; i<tot; ++i) {
int x=q[i].x, y=q[i].y;
int dec=min(g[x], g[y]);
g[x]-=dec; g[y]-=dec; ans+=dec;
}
printf("%lld\n", ans<<1);
return 0;
}

  

居然是图论题啊orzzzzzzzzzzzz

好题啊orzzzzzzzzz

首先我们每次新建一个节点表示合并的两个瓶子(而题目中的条件表明了这是一个森林!),然后发现询问的话其实就是两个瓶子的lca!

于是按lca的深度及其时间权值排序一下即可。

最新文章

  1. 为什么说每个程序员都应该刷几道LeetCode?
  2. 三种renderman规范引擎的dice对比
  3. $(&#39;div&#39;,&#39;li&#39;),$(&#39;div , li&#39;),$(&#39;div li&#39;)的区别
  4. wget的下载与安装使用
  5. nginx修改内核参数
  6. Linux下进程的同步相互排斥实例——生产者消费者
  7. 【POJ 1741】 Tree (树的点分治)
  8. svn 被锁定
  9. 使用LuaInterface遇到的编码问题
  10. 深入解析Java中volatile关键字的作用
  11. Singleton设计模式的一种见解
  12. Powershell 快捷键
  13. python对真假的判断方式
  14. 网站开发常用jQuery插件总结(二)弹出层插件Lightbox
  15. 与中国最顶尖sharepoint工程师共舞
  16. WebLogic SSRF
  17. 纠结了一下午的问题:运行opencv的HoughLinesP函数出错
  18. 【Java基础】16、小数的浮点型和定点型
  19. curl 模拟请求
  20. Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题

热门文章

  1. struts标签&lt;logic:iterate&gt;的用法
  2. 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题
  3. 使用SQL语句向已有数据表添加约束
  4. 面试题之【打印1到最大的N位数】
  5. W-数据库基础
  6. 在ASP.NET 5项目中使用和调试外部源代码包
  7. RTP RTCP在音视频传输与同步方面的使用
  8. MySQL数据库自带备份与恢复工具:MySQLdump.exe与mysql.exe
  9. Linux2.6 内核的 Initrd 机制解析
  10. jdk 1.8 Executors