求助大佬,TLE80

P3806 【模板】点分治 1

TLE自动机 @ 2019-06-06 11:52:53

我在想是root找错了还是n^2统计复杂度假了。。

虽然题解都是这样写的(

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
    int x=0,pos=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') pos=0;
    for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
    return pos?x:-x;
}
const int N=15001;
int ans[10000001],sz[N],son[N];
int n,m,vis[N],head[N],top=0;
struct node{
    int v,w,nex;
}edge[N<<1];
void add(int u,int v,int w){
    edge[++top].v=v;
    edge[top].w=w;
    edge[top].nex=head[u];
    head[u]=top;
}
int root,size;
void findrt(int now,int fa){
    sz[now]=1,son[now]=0;
    for(int i=head[now];i;i=edge[i].nex){
        int v=edge[i].v;
        if(vis[v]||v==fa) continue;
        findrt(v,now);
        sz[now]+=sz[v];
        if(sz[v]>son[now]) son[now]=sz[v];
    }
    if(size-sz[now]>son[now]) son[now]=size-sz[now];
    if(son[now]<son[root]) root=now;
}
int tot=0,dis[N];
void dfs(int now,int fa,int l){
    dis[++tot]=l;
    for(int i=head[now];i;i=edge[i].nex){
        int v=edge[i].v;
        if(vis[v]||v==fa) continue;
        dfs(v,now,l+edge[i].w);
    }
}
void get_ans(int now,int l,int c){
    tot=0;
    dfs(now,0,l);
    for(int i=1;i<=tot;i++){
        for(int j=1;j<=tot;j++){
            if(dis[i]+dis[j]>10000000) continue;
            ans[dis[i]+dis[j]]+=c;
        }
    }
}
void divide(int now){
    vis[now]=1;
    get_ans(now,0,1);
    for(int i=head[now];i;i=edge[i].nex){
        int v=edge[i].v;
        if(vis[v]) continue;
        get_ans(v,edge[i].w,-1);
        size=sz[v];
        root=0;
        findrt(v,now);
        divide(v);
    }
}
int main(){
    n=read(),m=read();
    for(int i=1;i<=n-1;i++){
        int u=read(),v=read(),w=read();
        add(u,v,w);
        add(v,u,w);
    }
    root=0,size=n;son[0]=n;
    findrt(1,0);
    divide(root);
    for(int i=1;i<=m;i++){
        int k=read();
        if(ans[k]) printf("AYE\n");
        else printf("NAY\n");
    }
    return 0;
}

by TLE自动机 @ 2019-06-06 12:09:17

本人已经卡常过此题。。第九个点刚好1000ms,刺激

但是我看DALAO们都说这题数据水啊?有大佬闲的话请帮忙康康我哪写错了。。


by あ→_→ @ 2019-06-06 12:37:13

统计不行吧。。。


by あ→_→ @ 2019-06-06 12:37:21

@TLE自动机


by NaCly_Fish @ 2019-06-06 12:40:53

正常情况此题最慢的点应该在200ms内的


by TLE自动机 @ 2019-06-06 14:39:53

@NaCly_Fish

突然意识到我这种暴力点分是 O(n^2\log n) (n=10000) 的。。能卡常过这数据也太水了


by Freddie @ 2019-07-11 20:01:50

en


|