数据范围:
#include <bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
inline void print(int n){
if(n>9)print(n/10);
putchar(n%10+'0');
}
const int N=1e6+7;
int n,q,k,a[N],f[N],c[N],dep[N];
vector<int> e[N];
void dfs(int x,int fa){
f[x]=fa;
c[x]=e[x].size()-1;
dep[x]=dep[fa]+1;
for(int i=0;i<e[x].size();i++){
if(e[x][i]!=fa)dfs(e[x][i],x);
}
}
bool cmp(int x,int y){
return dep[x]>dep[y];
}
int main(){
cin.tie(nullptr)->sync_with_stdio(false);
n=read(),q=read();
for(int i=1,u,v;i<n;i++){
u=read(),v=read();
e[u].push_back(v);e[v].push_back(u);
}
dfs(1,0);
while(q--){
unordered_map<int,int> vis;
k=read();
for(int i=1;i<=k;i++)a[i]=read();
sort(a+1,a+k+1,cmp);
int ans=1;
unordered_map<int,int> change;
for(int i=1;i<=k;i++){
if(vis.count(a[i]))continue;
c[f[a[i]]]--;
if(!change.count(f[a[i]])){
change[f[a[i]]]=1;
}else ++change[f[a[i]]];
vis[a[i]]=1;
if(!c[a[i]])continue;
ans+=c[a[i]];
}
print(ans);puts("");
for(auto &p:change)c[p.first]+=p.second;
}
return 0;
}
我们阅读这段代码。结合数据范围。可知时间复杂度为 O(klogk),那么问题来了。为什么 ∑k≤106 会在洛谷上运行 1.03s 如此之慢呢。