Egyptian Collegiate Programming Contest (ECPC 2015) C题 Connecting Graph
这题上次用的是线性求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相关推荐
- 2020 China Collegiate Programming Contest Weihai Site补题部分
A. Golden Spirit 签到题,首先把所有老人带到对岸,然后在对休息讨论一下即可. #define IO ios::sync_with_stdio(false);cin.tie();cout ...
- 【ZJCPC2018 第15届 浙江省赛】The 15th Zhejiang Provincial Collegiate Programming Contest(MABLJK 6题)
补题地址:https://zoj.pintia.cn/home/news 搜索15th 本文按照通过率补的题 M. Lucky 7 题意:如果存在从给出的长为n的序列中选择一个数+b 可以被7整除,就 ...
- 【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个数,对于每个数,找出一个能 ...
- 2020 China Collegiate Programming Contest Qinhuangdao Site 补题部分
已经补AEFGK E. Exam Results 枚举+二分+动态开点权值线段树O(nlogN)O(nlogN)O(nlogN) 智商太低,想不到什么贪心只能暴力数据结构维护 对于所有学生的最高成绩只 ...
- 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 ...
- 2015 German Collegiate Programming Contest (GCPC 15)
2015 German Collegiate Programming Contest (GCPC 15) B. Bounty Hunter II 给定一张DAG,求一种方案:用最少的路径将所有点覆盖. ...
- 2015 HIAST Collegiate Programming Contest J
Polygons Intersection 题意:给2个凸多边形,求相交面积 思路:不会,套板子就是了 AC代码: #include "iostream" #include &qu ...
- (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题)
layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题) author: " ...
- 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)
D.Distinctive Character 看到样例,第一个反应贪心.先写了个按这一位1和0的数目多少,确定0还是1的东西.感觉不够真,又写了个尽量加到相似的比较小的串上的贪心.在和前边的那个组合 ...
- (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest
layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest author: "luow ...
最新文章
- hash_hmac函数使用不当造成的安全问题
- 河北省电子工程高级职称公示_2019年河北省电子工程职称评审,中级职称已经出结果了!...
- 分布式事务中的CAP理论
- python apscheduler 动态_基于Flask-APScheduler实现添加动态定时任务
- 格力市值3900亿,美的市值6300亿
- LABJS的使用教程
- 水凝胶 静电纺丝_【再生医学前沿】Nature子刊:静电纺丝玩出新花样!静电射流偏转的超快3D打印亚微米结构...
- Linux 每日一练 :cat猫 的 反义词是啥 ? 是这个tac 哇哇哇!!
- matlab经验正交分解函数EOF的实现—基于Climate Data Toolbox操作
- 启动工程Ehcache报错
- 科技公司亚马逊名字由来_名字叫什么? 为什么亚马逊的“认可”是可爱营销的灾难性尝试
- 在java中关于封装性的说法中错误的是_java题库2
- android自定义四边形,以编程方式在Android中创建平行四边形绘图
- 关于react-router-dom 6.0.1的基础写法 解决Error A <Route> is only ever to be used as the child of <Routes>
- 休闲游戏合成植物打僵尸源码-H5+安卓+IOS三端源码
- BZOJ_1778_[Usaco2010_Hol]_Dotp_驱逐猪猡_(期望动态规划+高斯消元+矩阵)
- 将i am a student转换成 student a am i
- 特斯拉国产又怎样,十个月后就完蛋
- 为什么说全息投影离真正商业化还很遥远?
- tlc5620输出三角波流程图_单片机实践A/D和D/A转换的程序