基环树直径裸题

分别在子树做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. ubuntu mongodb报错:mongo - couldn't connect to server 127.0.0.1:27017

    在进入mongo的时候,出现在下面错误信息.那如何解决呢? 标记一下,以便下次理碰的到时候,有个参考. warning: Failed to connect to 127.0.0.1:27017, r ...

  2. Linux大文件快速处理小方法

    背景 工作中使用MapReduce任务导出一批含有路径的文件,共计行数300W+,需要检测文件是否在对应的服务器中存在,而文件所在的服务器并非hadoop集群的服务器,因此打算采用bash脚本进行.具 ...

  3. vscode好用的扩展及常用的快捷键

    1.open-in-browser 或者view in browser  安装后右键即可快速打开浏览器 2.quokka调试工具插件,能对正在编写的代码提供实时反馈,并能预览变量的函数和计算结果 3. ...

  4. hystrix应用介绍(一)

    声明:本文仅做个人的一次接口重构过程记录,期间参考了一些写的不错的博客,如果存在抄袭,请留言. hystrix基本介绍 hystrix 是一个开源的容灾框架,目的是为了解决当依赖服务出现故障或者接口响 ...

  5. Hibernate课程 初探一对多映射3-3 单向多对一的测试

    public static void testManyToOne(){ Student stu1 = new Student("小明","男"); Studen ...

  6. 跨平台图表控件TeeChart使用教程:导入XML数据

    TeeChart的最新版中包含了一个自动加载XML数据的新组件.这个组件的名字叫做TTeeXMLSource,用户可以在TeeXML.pas unit中找到这个组件. 加载XML图表所需的最小属性是& ...

  7. HBuilder中改造console.info

    HBuilder的js中console.info只会输出头一个参数,与谷歌浏览器行为不符合.让人很不习惯. 于是,对其改造一番. window.console.print=window.console ...

  8. Asp.net防御XSS攻击组件库

    一.AntiXss 翻看mvc4高级编程,偶看到作者强烈推荐使用AntiXss防御XSS攻击,收集资料看下. 目前类库已融入到.netframework中,类库主页不再更新. 使用方法:使用Nuget ...

  9. 关于form的action路径填写

    一:可以是相对路径: 1.action="<%=request.getContextPath() %>/html/index.html"  <%=request. ...

  10. Asp.Net实现伪静态(通过URLRewriter)

    一.起因 最近一个项目要实现伪静态,之前没接触过,故一切从零开始,开始网上查资料,方法大概有三种,但是我都试了好几个,都失败了.望有建议的博友给点建议,这里我实现了一种方式,是通过微软URLRewri ...