求大神看一看

P1600 [NOIP2016 提高组] 天天爱跑步

functionendless @ 2017-05-29 17:16:39

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#define N 300010
#define pb push_back
#define pii pair<int,int>
#define mp make_pair
#define F first
#define S second
using namespace std;
int n,m,dep[N],w[N],fa[N],fat[N],s[N],t[N],anc[N],cnt[3*N],ans[N];
vector<int> map[N];
vector<pii> rela[N],cf[N];
bool used[N];
int find(int x) {if(x!=fat[x]) fat[x]=find(fat[x]); return fat[x];}
void build_tre(int root,int f)
{
    int l=map[root].size();
    for(int i=0;i<l;i++)
        if(map[root][i]!=f)
        {
            int to=map[root][i];
            dep[to]=dep[root]+1; fa[to]=root;
            build_tre(to,root);
        }
}
void tarjan(int u)
{
    used[u]=1; fat[u]=u;
    int l=rela[u].size();
    for(int i=0;i<l;i++)
        if(used[rela[u][i].F] && !anc[rela[u][i].S])
            anc[rela[u][i].S]=find(rela[u][i].F);
    l=map[u].size();
    for(int i=0;i<l;i++)
        if(map[u][i]!=fa[u])
            {tarjan(map[u][i]); fat[map[u][i]]=u;}
}
void init()
{
    for(int i=1;i<=m;i++)
    {
        if(anc[i]==s[i])  {cf[t[i]].pb(mp(dep[s[i]],1));cf[fa[s[i]]].pb(mp(dep[s[i]],-1));}
        else if(anc[i]==t[i]) {cf[s[i]].pb(mp(dep[s[i]],1));cf[fa[t[i]]].pb(mp(dep[s[i]],-1));}
        else
        {
            cf[s[i]].pb(mp(dep[s[i]],1));
            cf[fa[anc[i]]].pb(mp(dep[s[i]],-1));
            cf[t[i]].pb(mp(dep[anc[i]]*2-dep[s[i]],1));
            cf[anc[i]].pb(mp(dep[anc[i]]*2-dep[s[i]],-1));
        }
    }
}
void dfs(int u)
{
    int sum=cnt[dep[u]+w[u]+N]+cnt[dep[u]-w[u]+N],l=cf[u].size();
    for(int i=0;i<l;i++)  cnt[cf[u][i].F+N]+=cf[u][i].S;
    l=map[u].size();
    for(int i=0;i<l;i++) if(map[u][i]!=fa[u]) dfs(map[u][i]);
    ans[u]=cnt[dep[u]+w[u]+N]+cnt[dep[u]-w[u]+N]-sum;
    if (!w[u]) ans[u]>>=1; 
}
int main()
{
    int i,x,y;
    scanf("%d %d",&n,&m);
    for(i=1;i<n;i++) {scanf("%d %d",&x,&y); map[x].pb(y); map[y].pb(x);}
    for(i=1;i<=n;i++) scanf("%d",&w[i]);
    build_tre(1,0);
    for(i=1;i<=m;i++) {scanf("%d %d",&s[i],&t[i]); rela[s[i]].pb(mp(t[i],i)); rela[t[i]].pb(mp(s[i],i));}
    tarjan(1);
    init(); dfs(1);
    for(i=1;i<=n;i++) printf("%d ",ans[i]);
    return 0;
}
T了第十三个点,但貌似不是真正的TLE,个人估计是哪里死循环了

|