基环树直径裸题

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

写起来很麻烦

#include<algorithm>
#include<iostream>
#include<cstdio>
#define int long long
using namespace std; inline int rd(){
int ret=0,f=1;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
while(isdigit(c))ret=ret*10+c-'0',c=getchar();
return ret*f;
}
#define pc putchar
#define space() pc(' ')
#define nextline() pc('\n')
void pot(int x){if(!x)return;pot(x/10);pc('0'+x%10);}
void out(int x){if(!x)pc('0');if(x<0)pc('-'),x=-x;pot(x);} const int MOD = 1e9+7; inline void upmax(int &x,int y){x=max(x,y);}
inline void upmin(int &x,int y){x=min(x,y);} int add(int x,int y){return x+y>MOD?x+y-MOD:x+y;}
int sub(int x,int y){return x-y<0?x-y+MOD:x-y;}
int mul(int x,int y){return (long long)(1ll*x*y)%MOD;}
void Add(int &x,int y){x=add(x,y);}
void Sub(int &x,int y){x=sub(x,y);}
void Mul(int &x,int y){x=mul(x,y);} const int MAXN = 1000005;
const int M = MAXN<<1; int n;
int nex[M],to[M],wi[M];
int head[MAXN],ecnt=1;
inline void adde(int x,int y,int w){
nex[++ecnt] = head[x];
to[ecnt] = y;
wi[ecnt] = w;
head[x] = ecnt;
}
int cir[MAXN],vis[MAXN],lenc; int dfn[MAXN],low[MAXN],tim;
int sta[MAXN],ins[MAXN],top;
void tarjan(int x,int frm){
dfn[x]=low[x]=++tim;
ins[sta[++top]=x]=1;
for(int i=head[x];i;i=nex[i]){
if(i==(frm^1)||i==frm)continue;
int v=to[i];
if(!dfn[v]){
tarjan(v,i);
upmin(low[x],low[v]);
}else if(ins[v]){
upmin(low[x],dfn[v]);
}
}
if(dfn[x]!=low[x]) return;
if(lenc>2) return;
int elm;
do{
elm=sta[top--];
ins[elm]=0;
cir[++lenc]=elm;
}while(elm!=x);
if(lenc<=2) lenc=0;
}
int ans;
int f[MAXN],g[MAXN],h[MAXN];
void dfs(int x,int pre){
for(int i=head[x];i;i=nex[i]){
int v=to[i];
if(v==pre||vis[v]) continue;
dfs(v,x);
upmax(ans,f[x]+f[v]+wi[i]);
upmax(f[x],f[v]+wi[i]);
}
} int dis[MAXN];
void dfs2(int x){
for(int i=head[cir[x]];i;i=nex[i]){
int v=to[i];
if(v!=cir[x+1])continue;
dis[x]=wi[i];
dfs2(x+1);
}
}
void gfs(int x,int pre){
// vis[x]=1;
for(int i=head[x];i;i=nex[i]){
int v=to[i];
if(v==pre) continue;
gfs(v,x);
upmax(ans,f[x]+f[v]+wi[i]);
upmax(f[x],f[v]+wi[i]);
}
} int q[MAXN*2],hd=1,tl;
signed main(){
freopen("darksoul8.in","r",stdin);
freopen("darksoul.out","w",stdout);
n=rd();
int x,y,w;
for(int i=1;i<=n;i++){
x=rd();y=rd();w=rd();
if(x==y) continue;
adde(x,y,w);adde(y,x,w);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,0);
for(int i=1;i<=lenc;i++) vis[cir[i]]=1;
for(int i=1;i<=lenc;i++) dfs(cir[i],0);
cir[lenc+1]=cir[1];
dfs2(1);
for(int i=1;i<=lenc;i++) g[i]=g[i+lenc]=f[cir[i]],dis[i+lenc]=dis[i];
dis[0]=dis[lenc]; dis[2*lenc+1]=dis[1];
int sumc=0;
for(int i=1;i<=lenc;i++) sumc+=dis[i];
for(int i=1;i<=lenc*2;i++) dis[i]+=dis[i-1];
int j=1;
while(dis[lenc]-dis[j-1]>sumc/2) j++;
for(int k=j;k<=lenc;k++){
while(hd<=tl&&g[q[tl]]-dis[q[tl]-1]<=g[k]-dis[k-1]) tl--;
q[++tl]=k;
}
for(int i=lenc+1;i<=lenc*2;i++){
while(hd<=tl&&dis[i-1]-dis[q[hd]-1]>sumc/2) hd++;
h[i]=g[q[hd]]-dis[q[hd]-1]+g[i]+dis[i-1];
while(hd<=tl&&g[q[tl]]-dis[q[tl]-1]<=g[i]-dis[i-1]) tl--;
q[++tl]=i;
}
for(int i=lenc+1;i<=lenc*2;i++) upmax(ans,h[i]);
out(ans+1);
return 0;
}

[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. netbeans 窗体字体大小设置

    当计算机分辨率变大的时候,打开netbeans的时候,字体就会变得越来越小 看起来很不爽,所要就要改变一下,窗体字体大小. 在网上找到了一段修改netbeans窗体字体大小的配置信息,现标记起来,以便 ...

  2. OpenStack Weekly Rank 2015.08.17

    Module Reviews Drafted Blueprints Completed Blueprints Filed Bugs Resolved Bugs Cinder 5 1 1 6 13 Sw ...

  3. mysql时间戳

    select unix_timestamp('2013-01-01 10:10:10'); , '%Y-%m-%d %H:%i:%S' ) date_format(date,'%Y-%m-%d') - ...

  4. [Android]JsonObject解析

    android和服务器进行交互的时候往往会有数据的传输,而数据中有一种类型就是Json型,这两天在研究API接口的问题,服务器返回的数据类型都是Json型的.例如: 1.接收到的json字符串分为两种 ...

  5. Powershell(3)

    Powershell 可以使用powershell管理的服务 share point, exchange, lync, windows azure, window server, system cen ...

  6. Makefile2

    规范 target可以是Object file, 可执行文件或者标签(标签一般没有依赖) 越靠近最终结果的target卸载越前面 定义target前, 定义CC, SRC, CFLAGS, OBJS, ...

  7. BNU 27847——Cellphone Typing——————【字典树】

    Cellphone Typing Time Limit: 5000ms Memory Limit: 131072KB This problem will be judged on UVA. Origi ...

  8. 关于web.xml的welcome-file-list 配置与tomcat的关系:

    关于web.xml的welcome-file-list 配置与tomcat的关系: 2018年04月18日 10:17:13 守望dfdfdf 阅读数:377 标签: welcome-file-lis ...

  9. spring-boot学习之属性配置

    通过@value注解,将配置文件中的内容引入

  10. poi3.8随记

    System.out.println(sheet.getFirstRowNum());//结果是0 System.out.println(sheet.getLastRowNum());//如果一共有3 ...