[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

原文地址:https://www.cnblogs.com/PYWBKTDA/p/11842540.html

时间: 2024-07-31 15:42:24

[cf1184E]Daleks' Invasion的相关文章

CF E2 - Daleks&#39; Invasion (medium) (LCA求两点树上路径上的最大边权)

http://codeforces.com/contest/1184/problem/E2 题意:给出一副图,首先求出这幅图的最小生成树 , 然后修改这幅图上不属于最小生成树的边权,使得修改后的图在求一边生成树的时候可以包含被修改的边(注意:修改的边权要最大 )题目规定只有一课生成树 分析: 现在我们需要解决所有非树边的任务(MST保证是惟一的).我们要求对于非树边(u, v),正确答案是u和v之间路径上的最大权值MST.(证明:≤:由MSTs的循环特性可知;≥:如果(u, v)的重量大于这个最

Multiclonal Invasion in Breast Tumors Identified by Topographic Single Cell Sequencing

Title:  Multiclonal Invasion in Breast Tumors Identified by Topographic Single Cell Sequencing 课题的目的和意义: Ductal carcinoma in situ (DCIS,原位导管癌)是一种早期的乳腺癌,很少发展成invasive ductal carcinoma(IDC,浸润型导管癌).由于瘤内异质性和导管中肿瘤细胞数量低,因此很难刻画在侵袭期间的基因组进化过程.为了克服这个障碍,作者开发了To

UVA 6480 Zombie Invasion(模拟退火)

A group of survivors has arrived by helicopter to an isolated island. The island is made up of a long narrow strip of villages. The infected survivors arrived in the village to the far east and accidentally infected the native population. The islande

根据76大细分词性对单词进行归组(二)

词性的重要性不言而喻,尤其是对于自然语言处理来说,哪怕就是记单词,根据词性对单词进行归组也是非常有帮助的. superword是一个Java实现的英文单词分析软件,主要研究英语单词音近形似转化规律.前缀后缀规律.词之间的相似性规律等等. 各大词性及其包括的词: 32.N-COUNT-COLL(可数集合名词) (词数:50) 1 aristocracy army array audience band 2 cast chapter command commission committee 3 co

English (一)

Phrase        do somebody a favour give sb a hand do something for sb come to sb aid  帮助某人 what can i do for you? = Is there anything i can do for you? 我可以帮助你吗? leave sb/sth + adj/adv/v_ing/v_ed(宾语补足语)   eg:leave the door open confident of sth/doing

肺炎-维基百科

http://en.wikipedia.org/wiki/Pneumonia the number of words: 3110word           count---------------------pneumoniae        18respiratory       17streptococcus      15aspiration        11pulmonary          9interstitial       9sputum             6infl

SPOJ 962 Intergalactic Map

Intergalactic Map Time Limit: 6000ms Memory Limit: 262144KB This problem will be judged on SPOJ. Original ID: IM64-bit integer IO format: %lld      Java class name: Main Jedi knights, Qui-Gon Jinn and his young apprentice Obi-Wan Kenobi, are entruste

美国政府关于Google公司2013年度的财务报表红头文件

请管理员移至新闻版块,谢谢! 来源:http://www.sec.gov/ 财务报表下载↓ 此文仅作参考分析. 10-K 1 goog2013123110-k.htm FORM 10-K UNITED STATES SECURITIES AND EXCHANGE COMMISSION Washington, D.C. 20549     FORM 10-K (Mark One)       ý ANNUAL REPORT PURSUANT TO SECTION 13 OR 15(d) OF TH

一些游戏列表已经研究过的会写日志和标注

streets of  rogue alpha 21b titan souls enter the gungeon hidden holks Sengoku Jidai – Bjeongja Horan Campaign (2nd Manchu Invasion of Korea 1636) Enemy Demo C-Wars Expect The Unexpected Blue Solar: Chaos War Predynastic Egypt 监狱建筑师 Hero Siege