居然是一道图论题 毫无思路

我们对于每一次的融合操作 \((a,b)\) 建一个新点\(c\) 并向\(a,b\)连边 再将\(b\)瓶当前的位置赋成\(c\) 这样子我们就可以建成一个森林

现在枚举每一种反应\(M_i\) 看他在森林里是否存在\(lca\) 存在就相当于会在\(lca\)处发生反应 因为有反应的顺序 我们对\(lca\)排序后先做\(lca\)深度大的 深度相同就先做\(M\)的\(id\)小的 这样就满足题意了

我交了半天 居然是因为倍增数组写错了 真菜o(╥﹏╥)o

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
  4. #define pa pair<int,int>
  5. #define mod 1000000007
  6. #define ll long long
  7. #define mk make_pair
  8. #define pb push_back
  9. #define fi fisrt
  10. #define se second
  11. #define cl(x) memset(x,0,sizeof x)
  12. #ifdef Devil_Gary
  13. #define bug(x) cout<<(#x)<<" "<<(x)<<endl
  14. #define debug(...) fprintf(stderr, __VA_ARGS__)
  15. #else
  16. #define bug(x)
  17. #define debug(...)
  18. #endif
  19. const int INF = 0x7fffffff;
  20. const int N=2e5+5;
  21. //*
  22. char *TT,*mo,but[(1<<15)+2];
  23. #define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin),TT==mo))?-1:*TT++)//*/
  24. inline int read(){
  25. int x=0,rev=0,ch=getchar();
  26. while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getchar();}
  27. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  28. return rev?-x:x;
  29. }
  30. struct Edge{
  31. int v,nxt;
  32. }e[N<<1];
  33. struct data{
  34. int u,v,f,dis,id;
  35. }a[N*3];
  36. ll ans;
  37. int g[N],n,cnt,tot,m,K,head[N<<1],dep[N<<1],bin[23]={1},f[N<<1][22],pos[N];
  38. void add(int u,int v){
  39. e[++tot].v=v,e[tot].nxt=head[u],head[u]=tot;
  40. }
  41. bool cmp(const data&a,const data&b){
  42. return a.dis==b.dis?a.id<b.id:a.dis>b.dis;
  43. }
  44. void dfs(int x){
  45. for(int i=1;i<=19&&bin[i-1]<=dep[x];i++) f[x][i]=f[f[x][i-1]][i-1];
  46. for(int i=head[x];i;i=e[i].nxt){
  47. int j=e[i].v;
  48. dep[j]=dep[x]+1,f[j][0]=x,dfs(j);
  49. }
  50. }
  51. int LCA(int u,int v){
  52. if(dep[u]<dep[v]) swap(u,v);
  53. int ret=dep[u]-dep[v];
  54. for(int i=19;~i;--i){
  55. if(bin[i]&ret){
  56. u=f[u][i];
  57. }
  58. }
  59. if(u==v) return u;
  60. for(int i=19;~i;i--){
  61. if(f[u][i]!=f[v][i]){
  62. u=f[u][i],v=f[v][i];
  63. }
  64. }
  65. return f[u][0];
  66. }
  67. int main(){
  68. #ifdef Devil_Gary
  69. freopen("in.txt","r",stdin);
  70. #endif
  71. n=read(),m=read(),K=read();
  72. for(int i=1;i<=20;i++) bin[i]=bin[i-1]<<1;
  73. for(int i=1;i<=n;i++) g[i]=read(),pos[i]=i;
  74. for(int i=1,x,y,z;i<=m;i++) {
  75. x=read(),y=read(),z=n+i;
  76. add(z,pos[x]),add(z,pos[y]),pos[y]=z;
  77. }
  78. for(int i=n+m;i;--i) if(!f[i][0]) dfs(i);
  79. for(int i=1;i<=K;i++){
  80. #define i cnt
  81. a[++i].u=read(),a[i].v=read(),a[i].f=LCA(a[i].u,a[i].v),a[i].dis=dep[a[i].f],a[i].id=i;
  82. #undef i
  83. if(!a[cnt].f) --cnt;
  84. }
  85. sort(a+1,a+cnt+1,cmp);
  86. for(int i=1,u,v,mn;i<=cnt;i++){
  87. if(!a[i].f) continue;
  88. u=a[i].u,v=a[i].v;
  89. mn=min(g[u],g[v]);
  90. g[u]-=mn,g[v]-=mn,ans+=mn;
  91. }
  92. printf("%lld\n",ans<<1);
  93. }

BZOJ3712[PA2014]Fiolki 建图+倍增lca的更多相关文章

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

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

  2. [bzoj3712][PA2014]Fiolki

    description 题面 data range \[ 0\le m<n\le 200000,0\le k\le 500000\] solution 之前本人一直煞笔地思考暴力是否可行 考虑按 ...

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

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

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

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

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

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

  6. BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)

    题意 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入建筑 ...

  7. [十二省联考2019]字符串问题——后缀自动机+parent树优化建图+拓扑序DP+倍增

    题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的 ...

  8. codevs 1036 商务旅行 (倍增LCA)

    /* 在我还不知道LCA之前 暴力跑的SPFA 70分 三个点TLE */ #include<iostream> #include<cstdio> #include<cs ...

  9. BFS+最小生成树+倍增+LCA【bzoj】4242 水壶

    [bzoj4242 水壶] Description JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有 ...

随机推荐

  1. Spring RedisTemplate操作-Set操作(5)

    @Autowired @Resource(name="redisTemplate") private RedisTemplate<String, String> rt; ...

  2. Your Prediction Gets As Good As Your Data

    Your Prediction Gets As Good As Your Data May 5, 2015 by Kazem In the past, we have seen software en ...

  3. python学习笔记5--加密模块hashlib

    import hashlib # md5 ybm_pwd='yuanbapqingsdfs234FF234HF@F' # m = hashlib.md5() # bytes_ybq = ybm_pwd ...

  4. 让你的HTML5&CSS3网站在老IE中也能正常显示的3种方法

    起初,IE其实也是一款非常有进取心的浏览器.但经过一段时间的蛰伏后,它已经成为了我们生活中的一道障碍.微软现在又重新开始向其它浏览器发起挑战,但事实情况是,新版的现代IE浏览器一直滞后于谷歌浏览器和火 ...

  5. 基于序列化技术(Protobuf)的socket文件传输

    好像好久都没更博文了,没办法,最近各种倒霉事情,搞到最近真的没什么心情,希望之后能够转运吧. 言归正传,这次我要做的是基于序列化技术的socket文件传输来无聊练一下手. 一.socket文件传输 之 ...

  6. 有关楼层滚动且对应楼层Nav导航高亮显示

    $(document).ready(function(e) { //定义数组,储存楼层距离顶部的高度(floorsTop) var floorsTop=[]; function floorsTopF( ...

  7. ARC 之内存转换

    CHENYILONG Blog ARC 之内存转换 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilo ...

  8. getopts 用法

    getopts是linux系统中的一个内置变量,一般用在循环中.每当执行循环是,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,否则不是合法选项.并将这些合法 ...

  9. 为什么今天的L4无人驾驶无法到达终局(转)

    本文来自于公众号驭势未来,是驭势科技的微信公众平台,本博客收录的这篇文章版权作者吴甘沙,博客中仅对部分内容进行编辑. 作者:吴甘沙 原文链接:here 声明:文中的观点只代表版权作者的观点,本转载不涉 ...

  10. Ubuntu 12.04安装后无法boot

    解决方法是: 在选择启动项时, U盘会有两种启动方式: UEFI和非UEFI的. 用非UEFI进入live CD安装系统后无法启动, 用UEFI重装后问题解决.