[cf1184E]Daleks' Invasion
先求出任意一棵最小生成树,然后对边分类讨论
1.非树边,答案即最小生成树的环上的最长边
2.树边,反过来考虑,相当于对于每一个点对那条路经打上标记,取min
对于1直接用倍增维护即可,对于2可以用树链剖分/差分+启发式合并但都需要两个log,所以有一种很神奇的做法
考虑从小到大枚举非树边,然后暴力修改,容易发现修改过的边就不用修改了,因此复杂度是o(m),问题是如何快速找到没有被修改过的边,可以使用并查集将修改过的边缩起来然后快速往上爬即可

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define mid (l+r>>1)
5 struct ji{
6 int x,y,z,id;
7 }e[N*10];
8 struct ji2{
9 int nex,to,len,id;
10 }edge[N<<1];
11 int E,n,m,x,y,head[N],sh[N],ff[N],up[N],vis[N*10],ans[N*10],f[N][21],mx[N][21];
12 bool cmp(ji x,ji y){
13 return x.z<y.z;
14 }
15 int find(int k){
16 if (k==ff[k])return k;
17 return ff[k]=find(ff[k]);
18 }
19 void add(int x,int y,int z,int id){
20 edge[E].nex=head[x];
21 edge[E].to=y;
22 edge[E].len=z;
23 edge[E].id=id;
24 head[x]=E++;
25 }
26 void dfs(int k,int fa,int id,int s){
27 sh[k]=s;
28 up[k]=id;
29 f[k][0]=fa;
30 for(int i=1;i<=20;i++){
31 f[k][i]=f[f[k][i-1]][i-1];
32 mx[k][i]=max(mx[k][i-1],mx[f[k][i-1]][i-1]);
33 }
34 for(int i=head[k];i!=-1;i=edge[i].nex)
35 if (edge[i].to!=fa){
36 mx[edge[i].to][0]=edge[i].len;
37 dfs(edge[i].to,k,edge[i].id,s+1);
38 }
39 }
40 pair<int,int> lca(int x,int y){
41 if (sh[x]<sh[y])swap(x,y);
42 int ans=0;
43 for(int i=20;i>=0;i--)
44 if (sh[f[x][i]]>=sh[y]){
45 ans=max(ans,mx[x][i]);
46 x=f[x][i];
47 }
48 if (x==y)return make_pair(x,ans);
49 for(int i=20;i>=0;i--)
50 if (f[x][i]!=f[y][i]){
51 ans=max(ans,max(mx[x][i],mx[y][i]));
52 x=f[x][i];
53 y=f[y][i];
54 }
55 return make_pair(f[x][0],max(ans,max(mx[x][0],mx[y][0])));
56 }
57 int main(){
58 scanf("%d%d",&n,&m);
59 for(int i=1;i<=m;i++){
60 scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
61 e[i].id=i;
62 }
63 sort(e+1,e+m+1,cmp);
64 memset(head,-1,sizeof(head));
65 for(int i=1;i<=n;i++)ff[i]=i;
66 for(int i=1;i<=m;i++){
67 x=find(e[i].x);
68 y=find(e[i].y);
69 if (x!=y){
70 ff[x]=y;
71 add(e[i].x,e[i].y,e[i].z,e[i].id);
72 add(e[i].y,e[i].x,e[i].z,e[i].id);
73 vis[i]=1;
74 }
75 }
76 dfs(1,0,0,0);
77 for(int i=1;i<=m;i++)ans[i]=1000000000;
78 for(int i=1;i<=n;i++)ff[i]=i;
79 for(int i=1;i<=m;i++)
80 if (!vis[i]){
81 x=lca(e[i].x,e[i].y).first;
82 ans[e[i].id]=lca(e[i].x,e[i].y).second;
83 while (find(e[i].x)!=find(x)){
84 e[i].x=find(e[i].x);
85 ans[up[e[i].x]]=e[i].z;
86 if (find(e[i].x)!=find(f[e[i].x][0]))ff[find(e[i].x)]=find(f[e[i].x][0]);
87 }
88 while (find(e[i].y)!=find(x)){
89 e[i].y=find(e[i].y);
90 ans[up[e[i].y]]=e[i].z;
91 if (find(e[i].y)!=find(f[e[i].y][0]))ff[find(e[i].y)]=find(f[e[i].y][0]);
92 }
93 }
94 for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
95 }
[cf1184E]Daleks' Invasion的更多相关文章
- CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)
http://codeforces.com/contest/1184/problem/E2 题意:给出一副图,首先求出这幅图的最小生成树 , 然后修改这幅图上不属于最小生成树的边权,使得修改后的图在求 ...
- 3406: [Usaco2009 Oct]Invasion of the Milkweed 乳草的入侵
3406: [Usaco2009 Oct]Invasion of the Milkweed 乳草的入侵 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 8 ...
- python编程从入门到实践 alien invasion 项目源码
现在上传一个 python编程从入门到实践 alien invasion 项目源码 以供大家学习参考 跟官方版本可能不太一样,因为是自己写的 也算是给新手一个参考 我用的环境是pycharm 可能需要 ...
- 【学习笔记】《Python从入门到实践》游戏-Alien Invasion
主模块alien_invasion.py #导入两个库 2 from settings import Settings from ship import Ship import game_functi ...
- Multiclonal Invasion in Breast Tumors Identified by Topographic Single Cell Sequencing
Title: Multiclonal Invasion in Breast Tumors Identified by Topographic Single Cell Sequencing 课题的目的 ...
- 洛谷 P2960 [USACO09OCT]Milkweed的入侵Invasion of the Milkweed
P2960 [USACO09OCT]Milkweed的入侵Invasion of the Milkweed 题目描述 Farmer John has always done his best to k ...
- UVA 6480 Zombie Invasion(模拟退火)
A group of survivors has arrived by helicopter to an isolated island. The island is made up of a lon ...
- 2018 Benelux Algorithm Programming Contest (BAPC 18)I In Case of an Invasion, Please. . .
题意:一副无向有权图,每个点有一些人,某些点是避难所(有容量),所有人要去避难所,问最小时间所有人都到达避难所, 题解:dij+二分+最大流check,注意到避难所最多10个,先挨个dij求到避难所的 ...
- 每日英语:The Invasion of the Online Tutors
It's a nightly dilemma in many households: A student hits a wall doing homework, and parents are too ...
随机推荐
- C++核心编程 4 类和对象-封装
C++面向对象的三大特性:封装.继承.多态 C++认为万事万物皆为对象,对象上有其属性和行为 封装 意义:1.将属性和行为作为一个整体,表现生活中的事物 语法: class 类名{ 访问权限:属性 ...
- Redis 高阶数据类型重温
今天这个专题接着上一篇 Redis 的基本数据类型 继续讲解剩下的高阶数据类型:BitMap.HyperLogLog 和 GEO hash.这些数据结构的底层也都是基于我们前面说的 5 种 基本类型, ...
- Object.create 和 Object.assign
Object.assign(target, ...source) 1.Object.assign方法只会拷贝源对象自身(不包括原型)的并且可枚举的属性到目标对象,使用源对象的get和目标对象的set, ...
- FastAPI 学习之路(四十六)WebSockets(二)
上一篇文章,我们分享了WebSockets一些入门的,我们这节课,在原来的基础上,对于讲解的进行一个演示.我们最后分享了依赖token等.首先我们对上次的代码进行调整. 我们之前分享FastAPI 学 ...
- OO_JAVA_四个单元的总结
总结本单元两次作业的架构设计 设计目标 尽量减少特殊容器的存在,能通用就通用,减少重复的类同代码. 基础容器的存在,就是为上述目标而服务的. 设计概要 底层:基础的.类型无关.无依赖的容器以及对应的查 ...
- docker run 的基本用法
docker run 命令用来创建并启动一个容器 语法:docker run [options] image [command] [args-] 示例:docker run -dit -v 别名:容器 ...
- js模板引擎laytpl的使用
在我们实际的开发过程中,可能会遇到使用ajax去后台获取一堆的数据,然后动态的渲染到页面上.比如:去后台获取一个list集合,然后将数据以表格的形式展示在页面上.另外一种可能发生的情况就是页面上需要批 ...
- 2021.5.24考试总结 [NOIP模拟3]
带着爆0的心态考的试,没想到整了个假rk2 (炸鱼大佬wtz忒强了OTZ T1 景区路线规划 这题对刚学完概率期望的我来说简直水爆了好吗.. 因为存在时间限制,不好跑高斯消元,就直接跑dp就完了. 令 ...
- Android DataBinding使用详解
简介 DataBinding是一个自动绑定UI的框架. 使用DataBinding需要在app根目录的build.gradle文件中加入DataBinding配置: android { .... da ...
- poj 3537 Crosses and Crosses (SG)
题意: 1 × n 个格子,每人每次选一个格子打上叉(不得重复),如果一个人画完叉后出现了连续的三个叉,则此人胜. 给n,判断先手胜还是先手败. 思路: 假设选择画叉的位置是i,则对方只能在前[1,i ...