跪求小一点的hack数据qwqwq

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

Spasmodic @ 2019-07-22 11:53:08

#include<bits/stdc++.h>
using namespace std;
const int N=300005;
int n,m,w[N],cx[N],ds[N*3],ans[N],tot,hd[N],d[N],f[N][20];
struct node{int u,v,lca,dis;}p[N];
struct edge{int t,nxt;}es[N<<1];
vector<int>v1[N],v2[N],v3[N];
void add(int u,int v){es[++tot]={v,hd[u]};hd[u]=tot;}
void dfs(int x){
    d[x]=d[f[x][0]]+1;
    for(int i=1;i<20;i++)f[x][i]=f[f[x][i-1]][i-1];
    for(int i=hd[x];i;i=es[i].nxt){
        int y=es[i].t;
        if(y!=f[x][0])f[y][0]=x,dfs(y);
    }
}
void dfs1(int u){
    int prev=ds[d[u]+w[u]+N];
    for(int i=hd[u],v;i;i=es[i].nxt)if((v=es[i].t)!=f[u][0])dfs1(v);
    ds[d[u]+N]+=cx[u];
    ans[u]+=ds[d[u]+w[u]+N]-prev;
    for(int k=0;k<(int)v1[u].size();k++)--ds[d[v1[u][k]]+N];
}
void dfs2(int u){
    int prev=ds[w[u]-d[u]+N];
    for(int i=hd[u],v;i;i=es[i].nxt)if((v=es[i].t)!=f[u][0])dfs2(v);
    for(int k=0;k<(int)v2[u].size();k++)++ds[v2[u][k]+N];
    ans[u]+=ds[w[u]-d[u]+N]-prev;
    for(int k=0;k<(int)v3[u].size();k++)--ds[d[v3[u][k]]+N];
}
int lca(int x,int y){
    if(d[x]<d[y])swap(x,y);
    for(int i=19;i>=0;i--)if(d[f[x][i]]>=d[y])x=f[x][i];
    if(x==y)return x;
    for(int i=19;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
    return f[x][0];
}
int main(){
//    freopen("scheme.in","r",stdin);
//    freopen("scheme.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1,u,v;i<n;i++)scanf("%d%d",&u,&v),add(u,v),add(v,u);
    for(int i=1;i<=n;i++)scanf("%d",&w[i]);
    dfs(1);
    for(int i=1,u,v;i<=m;i++){
        scanf("%d%d",&u,&v);
        int LCA=lca(u,v);
        p[i]=(node){u,v,LCA,d[u]+d[v]-2*d[LCA]};
        cx[u]++;
        v1[LCA].push_back(u);
        v2[v].push_back(p[i].dis-d[p[i].v]);
        v3[LCA].push_back(p[i].dis-d[p[i].v]);
    }
    dfs1(1),dfs2(1);
    for(int i=1;i<=m;i++)if(d[p[i].u]==d[p[i].lca]+w[p[i].lca])ans[p[i].lca]--;
    for(int i=1;i<=n;i++)printf("%d ",ans[i]);
    puts("");
    return 0;
}

by Spasmodic @ 2019-07-22 11:58:29

最好控制在10以内,n可以不等于m


by Spasmodic @ 2019-07-22 13:08:59

已AC,谢谢大家!


by 血色黄昏 @ 2021-09-07 19:35:05

@happyChristmas 所以有小数据了吗/dk,我过样例MLE15分/wq


by Spasmodic @ 2021-09-07 19:53:01

@血色黄昏 没有,当时我这里挂了

for(int k=0;k<(int)v3[u].size();k++)--ds[d[v3[u][k]]+N];
\to
for(int k=0;k<(int)v3[u].size();k++)--ds[v3[u][k]+N];

by 血色黄昏 @ 2021-09-07 20:00:17

@happyChristmas 您写的也是vector/se/qq


|