全部TLE求救

P3806 【模板】点分治 1

GarinGeek @ 2021-08-14 18:04:59

萌新初学淀粉,样例过了,第一个点下载测了一下没问题,但全部TLE,不知哪里写的不对,求各位巨犇救救孩子,orz。

#include<bits/stdc++.h>
using namespace std;
int k,top,root,cnt,n,m,now,ans[10000005],dis[10005],vis[10005],size[10005],mas[10005],head[10005],t1,t2,t3,val;
struct node{
    int v,chu,nxt;
}a[10005];
void merge(int g,int j,int l){
    a[++cnt].chu=j;
    a[cnt].nxt=head[g];
    a[cnt].v=l;
    head[g]=cnt;
}
void dfssize(int x,int fa){
    size[x]=1;
    mas[x]=0;
    for(int i=head[x];i;i=a[i].nxt){
    if(a[i].chu!=fa&&!vis[a[i].chu]){
        dfssize(a[i].chu,x);
        size[x]+=size[a[i].chu];
        mas[x]=max(mas[x],size[a[i].chu]);
    } 
    } 
}
void dfsroot(int zx,int x,int fa){
    if(size[zx]-size[x]>mas[x]) mas[x]=size[zx]-size[x];
    if(mas[x]<val){ 
        val=mas[x];
        root=x;
    }
    for(int i=head[x];i;i=a[i].nxt)
    if(!vis[a[i].chu]&&a[i].chu!=fa) dfsroot(zx,a[i].chu,x);
}
void dfsdis(int x,int fa,int d){
    dis[++top]=d;
    for(int i=head[x];i;i=a[i].nxt)
    if(a[i].chu!=fa&&!vis[a[i].chu])
    dfsdis(a[i].chu,x,d+a[i].v);
}
void calc(int x,int co){
    top=0;
    dfsdis(x,0,co);
    sort(dis+1,dis+1+top);
    for(register int i=1;i<=top;i++)
    for(register int j=i;j<=top;j++)
    ans[dis[i]+dis[j]]++;
}
void calc1(int x,int co){
    top=0;
    dfsdis(x,0,co);
    sort(dis+1,dis+1+top);
    for(int i=1;i<=top;i++)
    for(int j=i;j<=top;j++)
    ans[dis[i]+dis[j]]--;
}
bool dfs(int x){
    dfssize(x,0);
    val=2147483646;
    dfsroot(x,x,0);
    calc(root,0);
    vis[root]=1;
    for(register int i=head[root];i;i=a[i].nxt){
        if(!vis[a[i].chu]){
        calc1(a[i].chu,a[i].v);
        dfs(a[i].chu); 
        }
    }

} 
int main(){
    cin >> n >> m;
    for(register int i=1;i<n;i++){
    cin >> t1 >> t2 >> t3;
    merge(t1,t2,t3);
    merge(t2,t1,t3);
    }
    dfs(1);
    for(register int i=1;i<=m;i++){
    cin >> k;
    if(ans[k])cout << "AYE" << endl;
    else cout << "NAY" << endl;
    }
    return 0;
}

by flying_luzy_fish @ 2021-12-15 08:46:15

你dfs函数的返回值写成bool会错,改成void是60,还有别的问题


|