[BZOJ1131][POI2008]Sta(树形dp+维护)

来源:互联网 发布:男网络歌手好听的歌曲 编辑:程序博客网 时间:2024/06/04 20:00

题目:

我是超链接

题解:

和我今天做的某道题有点像?
好吧简直一样呢,就当练手啦(结果练了好久发现手残。。。与longlong元素有关(加减乘)的都要设成longlong

代码:

#include <cstdio>#include <iostream>#include <cstring>#define N 1000005#define LL long longusing namespace std;int tot,nxt[N*2],point[N],v[N*2],ans;LL maxx,h[N],size[N];void addline(int x,int y){    ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;    ++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x;}void dfs(int x,int fa){    h[x]=h[fa]+1;maxx+=h[x];size[x]=1;    for (int i=point[x];i;i=nxt[i])      if (v[i]!=fa)      {        dfs(v[i],x);        size[x]+=size[v[i]];      }}void answer(int x,int fa,LL cost){    for (int i=point[x];i;i=nxt[i])      if (v[i]!=fa)      {        LL t=cost-size[v[i]]+(size[1]-size[v[i]]);        if ((t>maxx)||(t==maxx && v[i]<ans)) maxx=t,ans=v[i];        answer(v[i],x,t);      }}int main(){    int n,i,z;    scanf("%d",&n);    for (i=1;i<n;i++)    {        int x,y;        scanf("%d%d",&x,&y);        addline(x,y);    }    dfs(1,0);ans=1;    answer(1,0,maxx);    printf("%d",ans);}