题目大意
询问树上最长距离,多组数据
思路
见here
code:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
#include<cstdio>
#include<map>
using namespace std;
int n,a[1000101][3],tot=1,m,fa,fa2,u[1000101],head[1000101],to[1000101],net[1000101],l,r;
int max(int x,int y)
{
if (x<y) return y;
else return x;
}
void add(int x,int y,int z)
{
to[tot]=y;
net[tot]=head[x];
u[tot]=z;
head[x]=tot;
tot++;
return;
}
void read(int& x)
{
x=0;
int f=1;
char ch=getchar();
while (!isdigit(ch)) (ch=='-')&&(f=-1),ch=getchar();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x*=f;
}
void dp1(int x)
{
for (int i=head[x];i;i=net[i])
{
dp1(to[i]);
if (a[to[i]][0]+u[i]>a[x][0])
{
a[x][1]=a[x][0];
a[x][2]=to[i];
a[x][0]=a[to[i]][0]+u[i];
}
else if (a[to[i]][0]+u[i]>a[x][1])
{
a[x][1]=a[to[i]][0]+u[i];
}
}
return;
}
int len;
void dp2(int x,int fa,int w)
{
len=(x==a[fa][2]?a[fa][1]+w:a[fa][0]+w);
if (len>a[x][0])
{
a[x][1]=a[x][0];
a[x][2]=fa;
a[x][0]=len;
}
else
{
if (len>a[x][1]) a[x][1]=len;
}
for (int i=head[x];i;i=net[i])
{
dp2(to[i],x,u[i]);
}
return;
}
void wr(int x)
{
if (x>9) wr(x/10);
putchar(x%10^48);
}
int xx[1000101],yy[1000101],lx,rx,ly,ry,ans=1,last=1;
int check()
{
lx=ly=1;
for (int i=1;i<=n;i++)
{
while (lx<=rx&&a[xx[rx]][0]>=a[i][0]) rx--;
rx++;
xx[rx]=i;
while (ly<=ry&&a[yy[ry]][0]<=a[i][0]) ry--;
ry++;
yy[ry]=i;
while (a[yy[ly]][0]>a[xx[lx]][0]+m)
{
if (yy[ly]>xx[lx]) last=xx[lx++]+1;
else last=yy[ly++]+1;
}
ans=max(ans,i-last+1);
}
return ans;
}
int main()
{
while (cin>>n)
{
memset(a,0,sizeof(a));
memset(yy,0,sizeof(yy));
memset(xx,0,sizeof(xx));
memset(u,0,sizeof(u));
memset(head,0,sizeof(head));
tot=1;
for (int i=2;i<=n;i++)
{
cin>>fa>>fa2;
add(fa,i,fa2);
}
dp1(1);
dp2(1,0,0);
for (int i=1;i<=n;i++) cout<<a[i][0]<<endl;
}
return 0;
}