求时间复杂度
  • 板块灌水区
  • 楼主lijunxi1
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/12/30 10:30
  • 上次更新2023/12/30 13:06:46
查看原帖
求时间复杂度
696431
lijunxi1楼主2023/12/30 10:30
#include<bits/stdc++.h>
using namespace std;
int n,k;
long long b[200005],g[15],ksm[60],ans;
map<long long,bool>mp;
int find(long long x){
	if(x==1)return 1;
	int l=1,r=10;
	while(l<r)
	{
		int mid=(l+r)>>1;
		if(g[mid]<x)l=mid+1;
		else r=mid;
	}
	return l;
}
bool pd(long long x)
{
	
	//cout<<x<<"\n";
	if(x==1)return mp[x];
	if(mp[x]==1)return 1;
	int c=find(x);
	long long cha=x-g[c-1];
	int w=g[c-2];
	if(cha%ksm[c-1]==0)w+=cha/ksm[c-1];
	else w+=(cha+ksm[c-1])/ksm[c-1];
	return pd(w);
}
long long q(long long x)
{
	int c=find(x);
	long long re=1,d=1;
	for(int i=c+1;i<=n;i++)
	{
		//cout<<c<<" "<<i<<" "<<re<<" "<<d<<"\n";		
		d*=ksm[i-1];re+=d;
	}
	return re;
}
int main ()
{
	//freopen("chimes.in","r",stdin);
	//freopen("chimes.out","w",stdout);
	ksm[0]=1;
	for(int i=1;i<=55;i++)ksm[i]=ksm[i-1]*2;
	for(int i=1;i<=10;i++)g[i]=g[i-1]+ksm[i*(i-1)/2];
	scanf("%d%d",&n,&k);
	ans=g[n];
	for(int i=1;i<=k;i++)scanf("%lld",&b[i]);
	sort(b+1,b+k+1);
	for(int i=1;i<=k;i++)
	{
		if(pd(b[i])==0)
		{
			mp[b[i]]=1;
			ans-=q(b[i]);
			//cout<<"include:"<<b[i]<<"\n";
			//cout<<q(b[i])<<"\n";
		}
		//cout<<"--------------\n";
	}
	printf("%lld",ans);
}

数据要求:

1≤n≤101\le n\le 10

1≤k≤2×1051\le k\le2\times10^5

保证 CiC_i 编号合法且不重复

内存限制: 256 MiB

时间限制: 1000 ms

题目类型: 传统

评测方式: 文本比较

求为什么 TLE 了?

2023/12/30 10:30
加载中...