关于map和unordered_map的时间复杂度
  • 板块灌水区
  • 楼主乘湘去
  • 当前回复13
  • 已保存回复13
  • 发布时间2021/2/17 19:17
  • 上次更新2023/11/5 03:09:03
查看原帖
关于map和unordered_map的时间复杂度
242234
乘湘去楼主2021/2/17 19:17

萌新昨天F题用unordered_map赛后被叉(TLE)了,但把unordered_map改成map它就能非常顺利地通过,这是为什么呢?

#include<bits/stdc++.h>
#define N 300006
using namespace std;
int n,m,a[N],tr[N];
unordered_map<int,int>mp,book;
inline int qr()
{
	int x=0,w=1;char ch=0;
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*w;
}
void add(int x,int q)
{
	while(x<=n){
		tr[x]+=q;
		x+=x&-x;
	}
}
int query(int x)
{
    int tot=0;
    while(x){
		tot+=tr[x];
		x-=x&-x;
	}
	return tot;
}
int main()
{
	srand(time(0));
	int T=qr();
	for(int op=1;op<=T;op++){
		n=qr();
		for(int i=0;i<=n;i++)tr[i]=0;
		for(int i=1;i<=n;i++)mp[a[i]=qr()]++;
		for(int i=1;i<=n;i++)
		if(!book[a[i]]){
			add(mp[a[i]]+1,-1);
			add(1,1);
			book[a[i]]=1;
		}
		int ans=n;
		for(int i=1;i<=n;i++){
			int cnt=query(i),num=cnt*i;
			ans=min(ans,n-num);
		}
		mp.clear();
		book.clear();
		printf("%d\n",ans);
	}
}

这是用unordered_map的代码,改成map就过了。

2021/2/17 19:17
加载中...