[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 ...
随机推荐
- ls命令剖析
目录 ls命令剖析 资料翻译 SYNOPSIS 使用方式 DESCRIPTION 说明 参数的说明 -l 参数字符的解释 文件权限的解释 FILES 文件夹 实战演练 ls 命令 ls -l 命令 l ...
- Mydoom样本分析报告
文件检测 信息 值 文件名 1.virus 文件类型 WIN 32 EXE 文件大小 41664 bytes MD5 3d466b0f8ba9f3fe03e137a34d79f682 SHA-256 ...
- Linux tomcat 部署war包
将打包好的 war包放在 webapps的文件夹下 在tomcat/conf 文件夹下的 server.xml 里填加 <Context path="" docBase=&q ...
- TypeScript中将函数中的局部变量“导出”的方法
首先是在模块a.js中声明一个可导出(export)的数据结构,例如: export class ModelInfo{ id: string; name:string; } 其次是在模块b中声明可导出 ...
- 4.1 The Example Domain 领域示例代码
4.1 The Example Domain 领域示例代码 The examples will use some concepts those are used by GitHub, like Iss ...
- 改善深层神经网络-week1编程题(Regularization)
Regularization Deep Learning models have so much flexibility and capacity that overfitting can be a ...
- 记一次关于pdf 下载需求变更到 pdf 在线预览
背景: 之前的需求是根据接口中提供的Blob数据实现PDF下载,已实现代码如下: 1 const url = window.URL.createObjectURL(newBlob([response. ...
- [no code][scrum meeting] Alpha 14
项目 内容 会议时间 2020-04-22 会议主题 周中讨论会议 会议时长 45min 参会人员 全体成员 $( "#cnblogs_post_body" ).catalog() ...
- Python中Numpy及Matplotlib使用
Python中Numpy及Matplotlib使用 1. Jupyter Notebooks 作为小白,我现在使用的python编辑器是Jupyter Notebook,非常的好用,推荐!!! 你可以 ...
- 验证人员应该以何种角度阅读spec
转载:验证人员应该以何种角度阅读spec - 微波EDA网 (mweda.com) 在开发流程中,设计和验证人员关注的点肯定是不一样的,尤其在spec的理解上,验证人员往往需要有自己独立的理解.在拿到 ...