这题上次用的是线性求LCA过的,数据比较水,当时没有被T掉(不过线性的做法是在线的)。现在重新的分析一下这个问题。在所有的操作都进行完毕以后,这个图形肯定会变成一棵树,而我们的要求是在这棵树上的一条链上求出边权值t的最大值,那么很显然的可以使用树链剖分来解决这个问题(在做这题之前我还不知道LCA也可以获得一条链上的最值)。然后再看这个问题,因为不论是LCA还是树链剖分,都不能够动态的修改树的形状然后维护最值,因此,这样的做法只能够采用离线的做法。最后需要注意的一点是,因为最后求得的这棵树,在时间i的时候已经把后面的操作也加上了,也就是说如果这条链上的最值大于时间i,那么在这个时刻i实际上这两点是没有被联通的。

  代码如下(LCA):

  1 #include <stdio.h>
  2 #include <algorithm>
  3 #include <string.h>
  4 #include <vector>
  5 using namespace std;
  6 const int N = 1e5 + 10;
  7 const int log_N = 20 + 1;
  8 typedef pair<int,int> pii;
  9
 10 int root[N];
 11 int find(int x) {return x == root[x] ? x : root[x] = find(root[x]);}
 12
 13 int n,m,T;
 14 int par[log_N][N];
 15 int dep[N];
 16 int op[N],uu[N],vv[N];
 17 vector<pii> G[N];
 18 int mx[log_N][N];
 19 void dfs(int u,int fa,int d)
 20 {
 21     par[0][u] = fa;
 22     dep[u] = d;
 23     for(int i=0;i<G[u].size();i++)
 24     {
 25         pii e = G[u][i];
 26         int v = e.first, w = e.second;
 27         if(v != fa)
 28         {
 29             mx[0][v] = w;
 30             dfs(v, u, d + 1);
 31         }
 32     }
 33 }
 34 void init_lca()
 35 {
 36     memset(par[0], -1, sizeof(par[0]));
 37     memset(mx,0,sizeof(mx));
 38     for(int i=1;i<=n;i++) if(par[0][i] == -1) dfs(i, -1, 0);
 39     for(int k=0;k+1<log_N;k++)
 40     {
 41         for(int u=1;u<=n;u++)
 42         {
 43             if(par[k][u] < 0) par[k+1][u] = -1;
 44             else par[k + 1][u] = par[k][par[k][u]], mx[k + 1][u] = max(mx[k][u], mx[k][par[k][u]]);
 45         }
 46     }
 47 }
 48
 49 void solve_lca(int u,int v,int i)
 50 {
 51     if(find(u) != find(v)) puts("-1");
 52     else
 53     {
 54         int ans = -1;
 55         if(dep[u] > dep[v]) swap(u, v);
 56         for(int k=0;k<log_N;k++)
 57         {
 58             if((dep[v] - dep[u]) >> k & 1)
 59             {
 60                 ans = max(ans, mx[k][v]);
 61                 v = par[k][v];
 62             }
 63         }
 64         if(u == v) printf("%d\n",ans > i ? -1 : ans);
 65         else
 66         {
 67             for(int k = log_N - 1; k >= 0; k--)
 68             {
 69                 if(par[k][u] != par[k][v])
 70                 {
 71                     ans = max(ans, mx[k][u]);
 72                     ans = max(ans, mx[k][v]);
 73                     u = par[k][u];
 74                     v = par[k][v];
 75                 }
 76             }
 77             ans = max(ans, max(mx[0][u], mx[0][v]));
 78             printf("%d\n",ans > i ? -1 : ans);
 79         }
 80     }
 81 }
 82
 83 void solve()
 84 {
 85     init_lca();
 86     for(int i=1;i<=m;i++)
 87     {
 88         if(op[i] == 2)
 89         {
 90             solve_lca(uu[i], vv[i], i);
 91         }
 92     }
 93 }
 94
 95 int main()
 96 {
 97     scanf("%d",&T);
 98     while(T--)
 99     {
100         scanf("%d%d",&n,&m);
101         for(int i=1;i<=n;i++) G[i].clear(), root[i] = i;
102         for(int i=1;i<=m;i++)
103         {
104             scanf("%d%d%d",op+i,uu+i,vv+i);
105             if(op[i] == 1)
106             {
107                 int rx = find(uu[i]), ry = find(vv[i]);
108                 if(rx == ry) continue;
109                 root[ry] = rx;
110                 G[uu[i]].push_back(pii(vv[i], i));
111                 G[vv[i]].push_back(pii(uu[i], i));
112             }
113         }
114         solve();
115     }
116     return 0;
117 }

转载于:https://www.cnblogs.com/zzyDS/p/6717861.html

Egyptian Collegiate Programming Contest (ECPC 2015) C题 Connecting Graph相关推荐

  1. 2020 China Collegiate Programming Contest Weihai Site补题部分

    A. Golden Spirit 签到题,首先把所有老人带到对岸,然后在对休息讨论一下即可. #define IO ios::sync_with_stdio(false);cin.tie();cout ...

  2. 【ZJCPC2018 第15届 浙江省赛】The 15th Zhejiang Provincial Collegiate Programming Contest(MABLJK 6题)

    补题地址:https://zoj.pintia.cn/home/news 搜索15th 本文按照通过率补的题 M. Lucky 7 题意:如果存在从给出的长为n的序列中选择一个数+b 可以被7整除,就 ...

  3. 【ZJCPC2019 第16届 浙江省赛】The 16th Zhejiang Provincial Collegiate Programming Contest(GFHIJ 5题)

    补题地址:https://zoj.pintia.cn/home/news 搜索16th 本文按照通过率补的题 G .Lucky 7 in the Pocket 题意:给出T个数,对于每个数,找出一个能 ...

  4. 2020 China Collegiate Programming Contest Qinhuangdao Site 补题部分

    已经补AEFGK E. Exam Results 枚举+二分+动态开点权值线段树O(nlogN)O(nlogN)O(nlogN) 智商太低,想不到什么贪心只能暴力数据结构维护 对于所有学生的最高成绩只 ...

  5. 2015 ACM Arabella Collegiate Programming Contest(F题)

    F. Palindrome [ Color: Pink ] A string is palindrome if it can be read the same way in either direct ...

  6. 2015 German Collegiate Programming Contest (GCPC 15)

    2015 German Collegiate Programming Contest (GCPC 15) B. Bounty Hunter II 给定一张DAG,求一种方案:用最少的路径将所有点覆盖. ...

  7. 2015 HIAST Collegiate Programming Contest J

    Polygons Intersection 题意:给2个凸多边形,求相交面积 思路:不会,套板子就是了 AC代码: #include "iostream" #include &qu ...

  8. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题)

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题) author: " ...

  9. 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)

    D.Distinctive Character 看到样例,第一个反应贪心.先写了个按这一位1和0的数目多少,确定0还是1的东西.感觉不够真,又写了个尽量加到相似的比较小的串上的贪心.在和前边的那个组合 ...

  10. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest author: "luow ...

最新文章

  1. hash_hmac函数使用不当造成的安全问题
  2. 河北省电子工程高级职称公示_2019年河北省电子工程职称评审,中级职称已经出结果了!...
  3. 分布式事务中的CAP理论
  4. python apscheduler 动态_基于Flask-APScheduler实现添加动态定时任务
  5. 格力市值3900亿,美的市值6300亿
  6. LABJS的使用教程
  7. 水凝胶 静电纺丝_【再生医学前沿】Nature子刊:静电纺丝玩出新花样!静电射流偏转的超快3D打印亚微米结构...
  8. Linux 每日一练 :cat猫 的 反义词是啥 ? 是这个tac 哇哇哇!!
  9. matlab经验正交分解函数EOF的实现—基于Climate Data Toolbox操作
  10. 启动工程Ehcache报错
  11. 科技公司亚马逊名字由来_名字叫什么? 为什么亚马逊的“认可”是可爱营销的灾难性尝试
  12. 在java中关于封装性的说法中错误的是_java题库2
  13. android自定义四边形,以编程方式在Android中创建平行四边形绘图
  14. 关于react-router-dom 6.0.1的基础写法 解决Error A <Route> is only ever to be used as the child of <Routes>
  15. 休闲游戏合成植物打僵尸源码-H5+安卓+IOS三端源码
  16. BZOJ_1778_[Usaco2010_Hol]_Dotp_驱逐猪猡_(期望动态规划+高斯消元+矩阵)
  17. 将i am a student转换成 student a am i
  18. 特斯拉国产又怎样,十个月后就完蛋
  19. 为什么说全息投影离真正商业化还很遥远?
  20. tlc5620输出三角波流程图_单片机实践A/D和D/A转换的程序

热门文章

  1. eclipse中遇到的小问题
  2. [转帖]我们是OIer、
  3. 【msdn】配置 ReportViewer 以进行远程处理
  4. 操作系统面试题(二)
  5. 深度学习模型参数初始化的方法
  6. HDU 6321(状压dp)
  7. 【HTML5+MVC4】xhEditor网页编辑器图片上传
  8. 1.1 让CPU占用率曲线听你指挥[cpu manager]
  9. opengl工具库glfw一 创建窗口
  10. 064 import和from...import