[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 ...
随机推荐
- redis编译安装、哨兵、集群
编译安装 #下载源代码解压 wget https://download.redis.io/releases/redis-5.0.13.tar.gz -P /home/ tar -xvf /home/r ...
- 2021.5.22 vj补题
A - Marks CodeForces - 152A 题意:给出一个学生人数n,每个学生的m个学科成绩(成绩从1到9)没有空格排列给出.在每科中都有成绩最好的人或者并列,求出最好成绩的人数 思路:求 ...
- Java(11)方法详细介绍
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201577.html 博客主页:https://www.cnblogs.com/testero ...
- Just My Code debugging
Just My Code debugging During a debugging session, the Modules window shows which code modules the d ...
- Linux中使用dd制作文件的.img
dd if=/dev/zero of=new_img.img bs=1M count=20 //生成20M的文件,bs块的大小,count块的数量 mkfs.ext3 new_img.img / ...
- 【UE4 C++ 基础知识】<5> 容器——TArray
概述 TArray 是UE4中最常用的容器类.其速度快.内存消耗小.安全性高. 其设计时未考虑扩展问题,因此建议在实际操作中勿使用 新建(new) 和 删除(delete) 创建或销毁 TArray ...
- Scrum Meeting 0425
零.说明 日期:2021-4-25 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成登录.注册A ...
- 面试官问:说说你对Java函数式编程的理解
常见的面试问题 总结一下,在Java程序员的面试中,经常会被问到类似这样的问题: Java中的函数式接口是什么意思? 注解 @FunctionalInterface 的作用是什么? 实现一个函数式接口 ...
- 【做题记录】 [JLOI2011]不等式组
P5482 [JLOI2011]不等式组 超烦人的细节题!(本人调了两天 QAQ ) 这里介绍一种只用到一只树状数组的写法(离线). 树状数组的下标是:所有可能出现的数据进行离散化之后的值. 其含义为 ...
- MyBatis源码分析(七):动态代理(Mybatis核心机制)
一.动态代理 动态代理是一种比较高级的代理模式,它的典型应用就是Spring AOP. 在传统的动态代理模式中,客户端通过ProxySubject调用RealSubject类的request( )方法 ...