[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 ...
随机推荐
- pure-ftpd管理FTP服务器,创建文件夹可以,但上传下载文件不行
两种原因 1.因为pure-ftpd的防火墙端口问题 # Port range for passive connections replies. - for firewalling. PassiveP ...
- 题解 CF468C Hack it!
题目传送门 Description 设 \(f(i)\) 表示 \(i\) 的数码只和,给出 \(a\),求出 \(l,r\) 使得 \(\sum_{i=l}^{r} f(i)\equiv 0\pmo ...
- ToString()字符串转换你用正确了吗?
前言 在开发中,ToString()这个方法太方便了,以致于误解大家转换时都是直接Object.ToString()直接转换, 其实不然, 一般都是转之前先判断是否为null后再进行转换,否则会直接报 ...
- rocketmq高可用集群部署(RocketMQ-on-DLedger Group)
rocketmq高可用集群部署(RocketMQ-on-DLedger Group) rocketmq部署架构 rocketmq部署架构非常多,都是为了解决一些问题,越来越高可用,越来越复杂. 单ma ...
- C 输入输出函数
流 就C程序而言,所有的I/O操作只是简单地从程序移入或移出字节的事情.这种字节流便称为流( stream ). 绝大多数流是完全缓存的,这意味着"读取"和"写入&quo ...
- linux Samba 搭建
Samba is a free and open-source software package that provides seamless file and print services to S ...
- UltraSoft - Beta - Postmortem事后分析
UltraSoft - Beta - PostMORTEM 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决的问题和定义都在[软软软]功能规格说明书 ...
- Photoshop教程,视频MP4格式转换为GIF格式
转自百度问题 https://zhidao.baidu.com/question/1497485136643778259.html Adobe PhotoShop软件的最bai新du本是可以编辑视zh ...
- HDI PCB一阶和二阶和三阶如何区分??
一阶板,一次压合即成,可以想像成最普通的板二阶板,两次压合,以盲埋孔的八层板为例,先做2-7层的板,压好,这时候2-7的通孔埋孔已经做好了,再加1层和8层压上去,打1-8的通孔,做成整板.三阶板就 ...
- T-SQL——函数——时间操作函数
目录 0. 日期和时间类型 0.0 时间类型 1. 转换函数 1.1 CAST 1.2 CONVERT 2. 日期操作函数 2.0 GETDATE和GETUTCDATE 2.1 SYSDATETIME ...