基环树直径裸题

分别在子树做DP,环上做DP,环上可以用单调队列优化到\(O(n)\)

写起来很麻烦

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstdio>
  4. #define int long long
  5. using namespace std;
  6. inline int rd(){
  7. int ret=0,f=1;char c;
  8. while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
  9. while(isdigit(c))ret=ret*10+c-'0',c=getchar();
  10. return ret*f;
  11. }
  12. #define pc putchar
  13. #define space() pc(' ')
  14. #define nextline() pc('\n')
  15. void pot(int x){if(!x)return;pot(x/10);pc('0'+x%10);}
  16. void out(int x){if(!x)pc('0');if(x<0)pc('-'),x=-x;pot(x);}
  17. const int MOD = 1e9+7;
  18. inline void upmax(int &x,int y){x=max(x,y);}
  19. inline void upmin(int &x,int y){x=min(x,y);}
  20. int add(int x,int y){return x+y>MOD?x+y-MOD:x+y;}
  21. int sub(int x,int y){return x-y<0?x-y+MOD:x-y;}
  22. int mul(int x,int y){return (long long)(1ll*x*y)%MOD;}
  23. void Add(int &x,int y){x=add(x,y);}
  24. void Sub(int &x,int y){x=sub(x,y);}
  25. void Mul(int &x,int y){x=mul(x,y);}
  26. const int MAXN = 1000005;
  27. const int M = MAXN<<1;
  28. int n;
  29. int nex[M],to[M],wi[M];
  30. int head[MAXN],ecnt=1;
  31. inline void adde(int x,int y,int w){
  32. nex[++ecnt] = head[x];
  33. to[ecnt] = y;
  34. wi[ecnt] = w;
  35. head[x] = ecnt;
  36. }
  37. int cir[MAXN],vis[MAXN],lenc;
  38. int dfn[MAXN],low[MAXN],tim;
  39. int sta[MAXN],ins[MAXN],top;
  40. void tarjan(int x,int frm){
  41. dfn[x]=low[x]=++tim;
  42. ins[sta[++top]=x]=1;
  43. for(int i=head[x];i;i=nex[i]){
  44. if(i==(frm^1)||i==frm)continue;
  45. int v=to[i];
  46. if(!dfn[v]){
  47. tarjan(v,i);
  48. upmin(low[x],low[v]);
  49. }else if(ins[v]){
  50. upmin(low[x],dfn[v]);
  51. }
  52. }
  53. if(dfn[x]!=low[x]) return;
  54. if(lenc>2) return;
  55. int elm;
  56. do{
  57. elm=sta[top--];
  58. ins[elm]=0;
  59. cir[++lenc]=elm;
  60. }while(elm!=x);
  61. if(lenc<=2) lenc=0;
  62. }
  63. int ans;
  64. int f[MAXN],g[MAXN],h[MAXN];
  65. void dfs(int x,int pre){
  66. for(int i=head[x];i;i=nex[i]){
  67. int v=to[i];
  68. if(v==pre||vis[v]) continue;
  69. dfs(v,x);
  70. upmax(ans,f[x]+f[v]+wi[i]);
  71. upmax(f[x],f[v]+wi[i]);
  72. }
  73. }
  74. int dis[MAXN];
  75. void dfs2(int x){
  76. for(int i=head[cir[x]];i;i=nex[i]){
  77. int v=to[i];
  78. if(v!=cir[x+1])continue;
  79. dis[x]=wi[i];
  80. dfs2(x+1);
  81. }
  82. }
  83. void gfs(int x,int pre){
  84. // vis[x]=1;
  85. for(int i=head[x];i;i=nex[i]){
  86. int v=to[i];
  87. if(v==pre) continue;
  88. gfs(v,x);
  89. upmax(ans,f[x]+f[v]+wi[i]);
  90. upmax(f[x],f[v]+wi[i]);
  91. }
  92. }
  93. int q[MAXN*2],hd=1,tl;
  94. signed main(){
  95. freopen("darksoul8.in","r",stdin);
  96. freopen("darksoul.out","w",stdout);
  97. n=rd();
  98. int x,y,w;
  99. for(int i=1;i<=n;i++){
  100. x=rd();y=rd();w=rd();
  101. if(x==y) continue;
  102. adde(x,y,w);adde(y,x,w);
  103. }
  104. for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,0);
  105. for(int i=1;i<=lenc;i++) vis[cir[i]]=1;
  106. for(int i=1;i<=lenc;i++) dfs(cir[i],0);
  107. cir[lenc+1]=cir[1];
  108. dfs2(1);
  109. for(int i=1;i<=lenc;i++) g[i]=g[i+lenc]=f[cir[i]],dis[i+lenc]=dis[i];
  110. dis[0]=dis[lenc]; dis[2*lenc+1]=dis[1];
  111. int sumc=0;
  112. for(int i=1;i<=lenc;i++) sumc+=dis[i];
  113. for(int i=1;i<=lenc*2;i++) dis[i]+=dis[i-1];
  114. int j=1;
  115. while(dis[lenc]-dis[j-1]>sumc/2) j++;
  116. for(int k=j;k<=lenc;k++){
  117. while(hd<=tl&&g[q[tl]]-dis[q[tl]-1]<=g[k]-dis[k-1]) tl--;
  118. q[++tl]=k;
  119. }
  120. for(int i=lenc+1;i<=lenc*2;i++){
  121. while(hd<=tl&&dis[i-1]-dis[q[hd]-1]>sumc/2) hd++;
  122. h[i]=g[q[hd]]-dis[q[hd]-1]+g[i]+dis[i-1];
  123. while(hd<=tl&&g[q[tl]]-dis[q[tl]-1]<=g[i]-dis[i-1]) tl--;
  124. q[++tl]=i;
  125. }
  126. for(int i=lenc+1;i<=lenc*2;i++) upmax(ans,h[i]);
  127. out(ans+1);
  128. return 0;
  129. }

[JZOJ] 5905. 黑暗之魂(darksoul)的更多相关文章

  1. [JZOJ 5905] [NOIP2018模拟10.15] 黑暗之魂(darksoul) 解题报告 (拓扑排序+单调队列+无向图基环树)

    题目链接: http://172.16.0.132/senior/#main/show/5905 题目: oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰 ...

  2. NOIP前的刷题记录

    因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数   组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...

  3. [NOIP2018模拟10.15]比赛报告

    闲扯 昨晚又颓到好晚,Yali的降智光环感觉持续至今... 题面好评 T1T3都玩过 逃) T1没看多久就开始写二分+并查集 然后T3看着眼熟想了一个多小时...结果啥都没想出来 赶紧看T2发现还是没 ...

  4. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  5. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  6. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  7. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

  8. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  9. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

随机推荐

  1. mac 下安装 mysql

    1. 下载mysql community server 2. 下载mysql workbench 3. 启动mysql server 4. 进入mysql命令行 5. 修改root密码 ALTER U ...

  2. spring boot 配置redis

    先配置属性: # database name spring.redis.database=0 # server host spring.redis.host=127.0.0.1 # server pa ...

  3. node搭环境(二)之 bower gulp

    前面详细记录了安装node及git,接来下要安装bower,首先创建一个空文件夹bowerandgulp. 步骤:1.安装node.js 2.node里面自带了 npm  3.通过npm 安装cnpm ...

  4. jq学习总结之方法

    三.方法 1.length 2.index()3.get() reverse()4.not()5.filter()6.find()7.each()8.addBack()9.attr()10.toggl ...

  5. IIS 伪静态 脚本映射 配置方法

    首先,是IIS7.0的配置,由于Windows Server 2008操作系统默认的IIS版本为7.0,我们知道,IIS7.0与IIS6.0 核心注意的地方:先要将应用池设置为集成模式,修改OK后,再 ...

  6. 日期API

    Java 8 在包java.time下包含了一组全新的时间日期API.下面的例子展示了这组新API里最重要的一些部分: 1.Clock 时钟 Clock类提供了访问当前日期和时间的方法,Clock是时 ...

  7. Hibernate课程 初探多对多映射1-1 多对多应用场景

    1 用途: 员工和项目之间的多对多关系 2 实现: 员工表和项目表之外,建立员工和项目关联表来实现: 3 hibernate应用: set元素和many-to-many来实现

  8. intellijidea课程 intellijidea神器使用技巧2-2 精准搜索

    高效定位: 1 类: 类的跳转: Ctrl shift n ==> 查询类名 Ctrl shift n n ==> jar包中的类 2 文件: Ctrl shift shift n ==& ...

  9. 写英文bug的经验总结

    本文链接: https://www.cnblogs.com/hchengmx/p/10800855.html 由于工作原因,开bug的时候需要由英文开,刚开的时候比较痛苦,因为有些词汇老师用的不太准确 ...

  10. 【Angular JS】正确调用JQuery与Angular JS脚本 - 修复Warning: Tired to load angular more than once

    自己正在做一个小网站,使用Angular JS + Express JS + Mongo DB,在开发过程中,遇到一些问题,所以整理出来.希望对大家都有帮助. 这是今天解决的一个问题,Angular ...