社区讨论
最后一个 Subtask TLE 求调
P3806【模板】点分治参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mj9shcnn
- 此快照首次捕获于
- 2025/12/17 17:08 2 个月前
- 此快照最后确认于
- 2025/12/17 17:26 2 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
constexpr int N=1e4+1,V=1e7+1;
int n,q,siz[N],f[N],maxv,rt,no[N],buc[V];
vector<pair<int,int> >e[N];
vector<pair<int,int> >queries;
vector<int>dist,alldis;
int dfs1(int u,int fa){
f[u]=0,siz[u]=1;
for(auto[v,w]:e[u]){
if(v==fa||no[v])
continue;
siz[u]+=dfs1(v,u);
f[u]=max(f[u],siz[v]);
}
return siz[u];
}
void dfs2(int u,int tot,int fa){
f[u]=max(f[u],tot-siz[u]);
if(f[u]>maxv)
maxv=f[u],rt=u;
for(auto[v,w]:e[u]){
if(v==fa||no[v])
continue;
dfs2(v,tot,u);
}
return;
}
void dfs3(int u,int dis,int fa){
dist.push_back(dis);
for(auto[v,w]:e[u]){
if(v==fa||no[v])
continue;
dfs3(v,dis+w,u);
}
return;
}
void dividetree(int u){
maxv=0,rt=u;
dfs2(u,dfs1(u,0),0);
alldis.clear();
buc[0]=1;
alldis.push_back(0);
for(auto[v,w]:e[rt]){
if(no[v])
continue;
dist.clear();
dfs3(v,w,rt);
for(auto&[k,ans]:queries){
if(ans)
continue;
for(auto d:dist){
if(k<d||k-d>=V)
continue;
ans|=buc[k-d];
}
}
for(auto d:dist){
if(d>=V)
continue;
buc[d]=1,alldis.push_back(d);
}
}
for(auto d:alldis)
buc[d]=0;
no[rt]=1;
for(auto[v,w]:e[rt]){
if(no[v])
continue;
dividetree(v);
}
return;
}
int main(){
cin>>n>>q;
for(int i=1,u,v,w;i<n;i++){
cin>>u>>v>>w;
e[u].push_back({v,w}),
e[v].push_back({u,w});
}
for(int i=1,val;i<=q;i++){
cin>>val;
queries.push_back({val,0});
}
dividetree(1);
for(auto[k,ans]:queries)
cout<<(ans?"AYE\n":"NAY\n");
return 0;
}
不知道是不是重心找错了,也可能是被卡常了。
回复
共 0 条回复,欢迎继续交流。
正在加载回复...