参观wwx的代码,这暴力简直神了,我太弱,有些细节还是没看懂
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
using namespace std;
const int Maxn=100005,inf=999999999+208;
typedef long long LL;
int n,d[Maxn],ans=0;
int fst[Maxn],next[Maxn*2],to[Maxn*2],dis[Maxn*2],En=0;
int dist[Maxn],fa[Maxn],Q[Maxn];
int get(){
int v;char ch;
while (!isdigit(ch=getchar()));v=ch-48;
while (isdigit(ch=getchar()))v=v*10+ch-48;return v;
}
struct node *null;
struct node{
int k;LL b;//y=kx-b
node *lc,*rc;
inline node(){k=0;b=0;lc=rc=null;}
}Tnull;
class Segment_Tree{
node *root;
void Insert(node *&x,int l,int r,int k,int b)
{
if (x==null) x=new node();
x->k+=k;x->b+=b;
if (l==r) return;int mid=(l+r)>>1;
if (b<=mid) Insert(x->lc,l,mid,k,b);
else Insert(x->rc,mid+1,r,k,b);
}
int qry(node *x,int l,int r,int D,int k,LL b)
{
if (l==r) return l;
int mid=(l+r)>>1;
if ((LL)(x->lc->k+k)*mid-b-x->lc->b>=D) return qry(x->lc,l,mid,D,k,b);
return qry(x->rc,mid+1,r,D,k+x->lc->k,b+x->lc->b);
}
node *Merge(node *x,node *y)
{
if (x==null) return y;
if (y==null) return x;
x->k+=y->k;x->b+=y->b;
x->lc=Merge(x->lc,y->lc);
x->rc=Merge(x->rc,y->rc);delete y;return x;
}
public:
Segment_Tree(){root=null;}
void Insert(int _k,int _b){Insert(root,0,inf,_k,_b);}
int qry(int D,int dis){return qry(root,0,inf,D,0,0)-dis;}
void Merge(Segment_Tree *y){root=Merge(root,y->root);}
}*T[Maxn];
void addedge(int u,int v,int l)
{
next[++En]=fst[u];fst[u]=En;to[En]=v;dis[En]=l;
next[++En]=fst[v];fst[v]=En;to[En]=u;dis[En]=l;
}
void work()
{
int l=1,r=2;Q[1]=1;fa[1]=0;
while (l<r)
{
int x=Q[l++];
for (int k=fst[x];k;k=next[k])
if (fa[x]!=to[k]) Q[r++]=to[k],dist[to[k]]=dist[x]+dis[k],fa[to[k]]=x;
}
for (int i=0;i<=n;i++) T[i]=new Segment_Tree();
for (int i=r-1;i;i--)
{
int x=Q[i],Time=0;
if (d[x]) Time=T[x]->qry(d[x],dist[x]);
T[x]->Insert(1,Time+dist[x]);
ans=max(ans,Time);T[fa[x]]->Merge(T[x]);
}
}
int main()
{
freopen("conquer.in","r",stdin);
freopen("conquer.out","w",stdout);
n=get();null=&Tnull;null->lc=null->rc=null;
for (int i=1;i<=n;i++) d[i]=get();
for (int i=1;i<n;i++)
{
int u=get(),v=get(),l=get();addedge(u,v,l);
}
work();
printf("%d\n",ans);
//system("pause");
return 0;
}
标程神一样的6kb,有解释就不放了吧~~~