社区讨论
求看复杂度玄关
P3806【模板】点分治参与者 2已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mkpdexpe
- 此快照首次捕获于
- 2026/01/22 19:30 4 周前
- 此快照最后确认于
- 2026/01/23 14:40 4 周前
rt 7 8 tle 复杂度哪里不对?
CPP#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
const int inf=2e8;
vector<int> G[N];
bool res[N];
bool vis[N];
int siz[N];
long long dp[N];
long long k[N];
int ans,x;
int all=0;
int n,q;
map<pair<int,int>,int> w;
map<long long,bool> m1;
void getG(int u,int fa)
{
siz[u]=1;
int p=0;
for(int i=0;i<G[u].size();i++)
{
if(G[u][i]==fa||vis[G[u][i]]) continue;
getG(G[u][i],u);
siz[u]+=siz[G[u][i]];
p=max(siz[G[u][i]],p);
}
p=max(p,all-siz[u]);
if(p<x)
{
ans=u,x=p;
}
return;
}
void dfs2(int u,int fa)
{
dp[u]=w[make_pair(u,fa)]+dp[fa];
// cout<<u<<' '<<dp[u]<<'\n';
for(int i=1;i<=q;i++)
{
if(m1[k[i]-dp[u]])
{
res[i]=1;
}
}
for(int i=0;i<G[u].size();i++)
{
if(G[u][i]==fa||vis[G[u][i]]) continue;
dfs2(G[u][i],u);
}
return;
}
void dfs3(int u,int fa)
{
siz[u]=1;
int p=0;
for(int i=0;i<G[u].size();i++)
{
if(G[u][i]==fa||vis[G[u][i]]) continue;
dfs3(G[u][i],u);
siz[u]+=siz[G[u][i]];
}
m1[dp[u]]=1;
return;
}
void dfs(int u,int fa)
{
m1[0]=1;
dp[u]=0;
siz[u]=0;
vis[u]=1;
for(int i=0;i<G[u].size();i++)
{
if(G[u][i]==fa||vis[G[u][i]]) continue;
dfs2(G[u][i],u);
dfs3(G[u][i],u);
}
m1.clear();
for(int i=0;i<G[u].size();i++)
{
if(G[u][i]==fa||vis[G[u][i]]) continue;
ans=0,x=inf;
all=siz[G[u][i]];
getG(G[u][i],u);
dfs(ans,ans);
}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL);
cin>>n>>q;
for(int i=1;i<n;i++)
{
int u,v,w1;
cin>>u>>v>>w1;
G[u].push_back(v);
G[v].push_back(u);
w[make_pair(u,v)]=w[make_pair(v,u)]=w1;
}
for(int i=1;i<=q;i++) cin>>k[i];
dfs(1,1);
for(int i=1;i<=q;i++)
{
if(res[i]) cout<<"AYE\n";
else cout<<"NAY\n";
}
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...