description

题面

data range

\[0\le m<n\le 200000,0\le k\le 500000
\]

solution

之前本人一直煞笔地思考暴力是否可行

考虑按照操作关系直接构树,之后按照每个反应中两点在树上的\(lca\)深度排序

最后依次考虑每个反应即可

虽然说建出来的也是个\(Kruskal\)重构树

code

没有按质合并的并查集都能过

  1. #include<bits/stdc++.h>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<iomanip>
  6. #include<cstring>
  7. #include<complex>
  8. #include<vector>
  9. #include<cstdio>
  10. #include<string>
  11. #include<bitset>
  12. #include<ctime>
  13. #include<cmath>
  14. #include<queue>
  15. #include<stack>
  16. #include<map>
  17. #include<set>
  18. #define FILE "a"
  19. #define mp make_pair
  20. #define pb push_back
  21. #define RG register
  22. #define il inline
  23. using namespace std;
  24. typedef unsigned long long ull;
  25. typedef vector<int>VI;
  26. typedef long long ll;
  27. typedef double dd;
  28. const dd eps=1e-10;
  29. const int mod=1e9+7;
  30. const int N=400010;
  31. const int M=500010;
  32. const dd pi=acos(-1);
  33. const int inf=2147483645;
  34. const ll INF=1e18+1;
  35. const ll P=100000;
  36. il ll read(){
  37. RG ll data=0,w=1;RG char ch=getchar();
  38. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  39. if(ch=='-')w=-1,ch=getchar();
  40. while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
  41. return data*w;
  42. }
  43. il void file(){
  44. srand(time(NULL)+rand());
  45. freopen(FILE".in","r",stdin);
  46. freopen(FILE".out","w",stdout);
  47. }
  48. int num,n,m,k,g[N],t;ll ans;
  49. int fa[N],f[20][N];
  50. int find(int x){return fa[x]?fa[x]=find(fa[x]):x;}
  51. int dep[N],RT;
  52. int head[N],nxt[N],to[N],cnt;
  53. il void add(int u,int v){
  54. to[++cnt]=v;
  55. nxt[cnt]=head[u];
  56. head[u]=cnt;
  57. }
  58. void dfs(int u,int ff){
  59. f[0][u]=ff;dep[u]=dep[ff]+1;
  60. for(RG int i=1;f[i-1][f[i-1][u]];i++)f[i][u]=f[i-1][f[i-1][u]];
  61. for(RG int i=head[u];i;i=nxt[i]){
  62. RG int v=to[i];dfs(v,u);
  63. }
  64. }
  65. struct edge{int u,v,id,d;}E[M];
  66. bool cmp(edge x,edge y){if(x.d==y.d)return x.id<y.id;return x.d>y.d;}
  67. il int lca(int u,int v){
  68. if(dep[u]<dep[v])swap(u,v);
  69. RG int d=dep[u]-dep[v];
  70. for(RG int i=19;~i;i--)if(d&(1<<i))u=f[i][u];
  71. if(u==v)return u;
  72. for(RG int i=19;~i;i--)
  73. if(f[i][u]!=f[i][v])u=f[i][u],v=f[i][v];
  74. if(u==v)return u;
  75. return f[0][u];
  76. }
  77. int main()
  78. {
  79. num=n=read();m=read();k=read();
  80. for(RG int i=1;i<=n;i++)g[i]=read();
  81. for(RG int i=1,a,b;i<=m;i++){
  82. a=read();b=read();a=find(a);b=find(b);
  83. num++;fa[a]=fa[b]=num;add(num,a);add(num,b);
  84. }
  85. for(RG int i=1;i<=n+n;i++)if(!fa[i])dfs(i,0);
  86. for(RG int i=1,a,b;i<=k;i++){
  87. a=read();b=read();if(find(a)!=find(b))continue;
  88. E[++t]=(edge){a,b,i,dep[lca(a,b)]};
  89. }
  90. sort(E+1,E+t+1,cmp);
  91. for(RG int i=1,s;i<=t;i++){
  92. s=min(g[E[i].u],g[E[i].v]);
  93. g[E[i].u]-=s;g[E[i].v]-=s;ans+=2ll*s;
  94. }
  95. printf("%lld\n",ans);
  96. return 0;
  97. }

[bzoj3712][PA2014]Fiolki的更多相关文章

  1. BZOJ3712[PA2014]Fiolki——并查集重构树

    题目描述 化学家吉丽想要配置一种神奇的药水来拯救世界.吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[i]克的第i种物质.吉丽需要执行一定的步骤来配置药水,第i个步骤 ...

  2. BZOJ3712[PA2014]Fiolki 建图+倍增lca

    居然是一道图论题 毫无思路 我们对于每一次的融合操作 $(a,b)$ 建一个新点$c$ 并向$a,b$连边 再将$b$瓶当前的位置赋成$c$ 这样子我们就可以建成一个森林 现在枚举每一种反应$M_i$ ...

  3. [bzoj3712][PA2014]Fiolki_倍增LCA

    Fiolki bzoj-3712 PA-2014 题目大意:题目链接. 注释:略. 想法: 神题! 我们建树:对于一次倾倒操作,我们弄一个新的大瓶子作为两个合并瓶子的父亲节点,与两个瓶子相连. 对于一 ...

  4. 【BZOJ-3712】Fiolki LCA + 倍增 (idea题)

    3712: [PA2014]Fiolki Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 303  Solved: 67[Submit][Status] ...

  5. [PA2014]Fiolki

    [PA2014]Fiolki 题目大意: 有\(n(n\le2\times10^5)\)种不同的液体物质和\(n\)个容量无限的药瓶.初始时,第\(i\)个瓶内装着\(g_i\)克第\(i\)种液体. ...

  6. 【BZOJ3712】Fiolki(并查集重构树)

    [BZOJ3712]Fiolki(并查集重构树) 题面 BZOJ 题解 很神仙的题目. 我们发现所有的合并关系构成了一棵树. 那么两种不同的东西如果产生反应,一定在两个联通块恰好联通的时候反应. 那么 ...

  7. BZOJ 3712: [PA2014]Fiolki 倍增+想法

    3712: [PA2014]Fiolki Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 437  Solved: 115[Submit][Status ...

  8. 【BZOJ】3712: [PA2014]Fiolki

    http://www.lydsy.com/JudgeOnline/problem.php?id=3712 题意:n个瓶子,第i个瓶子里又g[i]克物质.m次操作,第i次操作把第a[i]个瓶子的东西全部 ...

  9. bzoj 3712: [PA2014]Fiolki

    Description 化学家吉丽想要配置一种神奇的药水来拯救世界.吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[i]克的第i种物质.吉丽需要执行一定的步骤来配置药 ...

随机推荐

  1. LeetCode:35. Search Insert Position(Easy)

    1. 原题链接 https://leetcode.com/problems/search-insert-position/description/ 2. 题目要求 给定一个已经排好序的数组和一个目标值 ...

  2. springboot整合kafka应用

    1.kafka在消息传递的使用非常普遍,相对于activemq来说kafka的分布式管理和使用更加灵活. 2.activemq的搭建和使用可以参考: activemq搭建和springmvc的整合:h ...

  3. vim 安装

    Ubuntu 16.04 下 Vim安装及配置 默认已经安装了VIM-tiny linuxidc@linuxidc:~$ locate vi | grep 'vi$' |xargs ls -al lr ...

  4. OSG-交互

    本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html 作者写的比较好,再次收藏,希望更多的人可以看到这个文章 互联网是是一个相 ...

  5. Appium1.8及以上命令行启动

    安装命令行启动版本的Appium,appium-doctor需要独立下载了,用 npm的话需要FQ才好使,所有安装了cnpm代替npm, cnpm是从淘宝的国内镜像下载 npm config rm p ...

  6. Jenkins构建完成后实现自动将war包部署到指定服务器

    首先我们需要确定我们的jenkins安装了:publish over ssh 插件,如果没有安装,到-->jenkins首页-->系统管理-->插件管理-->可选安装里面去搜 ...

  7. python编程os、os.path 模块中关于文件、目录常用的函数使用方法

    os模块中关于文件/目录常用的函数使用方法   函数名 使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path='.') 列举指定目录中的文件名( ...

  8. TPO-12 C1 Revise a Hemingway paper

    TPO-12 C1 Revise a Hemingway paper 第 1 段 1.Listen to a conversation between a student and a professo ...

  9. 复合词 (Compund Word,UVa 10391)

    题目描述: 题目思路: 用map保存所有单词赋键值1,拆分单词,用map检查是否都为1,即为复合词 #include <iostream> #include <string> ...

  10. [Clr via C#读书笔记]Cp1CLR执行模型

    Cp1CLR执行模型 本章的概念点 CLR=Common Language Runtime 内存管理,程序集加载,安全性,异常处理和线程同步.CLR是基础,支持着面向它的各种语言.各种语言会被对应的编 ...