悬关(不用调试) 关于时间复杂度与常数
  • 板块学术版
  • 楼主CleverRaccoonʕ•ᴥ•ʔ
  • 当前回复17
  • 已保存回复17
  • 发布时间2025/8/4 15:43
  • 上次更新2025/8/4 20:27:25
查看原帖
悬关(不用调试) 关于时间复杂度与常数
718487
CleverRaccoonʕ•ᴥ•ʔ楼主2025/8/4 15:43

数据范围:

#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)\mathcal{O}(k\log k),那么问题来了。为什么 k106\sum k\leq 10^6 会在洛谷上运行 1.03s1.03 s 如此之慢呢。

2025/8/4 15:43
加载中...