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
突然意识到我这种暴力点分是
by Freddie @ 2019-07-11 20:01:50
en