求证时间复杂度
  • 板块灌水区
  • 楼主yinbe2
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/16 15:57
  • 上次更新2024/7/16 16:42:40
查看原帖
求证时间复杂度
1285691
yinbe2楼主2024/7/16 15:57

代码:

#include<iostream>
#include<queue>
using namespace std;
int n,k,t,cnt,fa[300005];
int find_fa(int i)
{
	if(fa[i]==i)return i;
	fa[i]=find_fa(fa[i]);
	return fa[i];
}
struct farmer
{
	int id;
	long long times;
}fuben[300005];
priority_queue<farmer,vector<farmer>,greater<farmer> >pq;
bool operator>(farmer f1,farmer f2)
{
	if(f1.times!=f2.times)return f1.times>f2.times;
	return f1.id>f2.id;
}
int main()
{
//	freopen("P10277_10.in","r",stdin);
//	freopen("test.out","w",stdout);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=k;i++)
	{
		scanf("%d",&t);
		pq.push({i,t});
		fa[i]=i;
	}
	for(int i=k+1;i<=n;i++)
	{
		scanf("%d",&t);
		farmer x=pq.top();
		pq.pop();
		if(pq.top().times!=x.times)pq.push({x.id,x.times+t});
		else
		{
			cnt=1;
			fuben[1].id=x.id;
			fuben[1].times=x.times;
			while(!pq.empty()&&pq.top().times==x.times)
			{
				x=pq.top();
				pq.pop();
				cnt++;
				fuben[cnt].id=x.id;
				fuben[cnt].times=x.times;				
			}
			for(int i=2;i<=cnt;i++)fa[find_fa(fuben[i].id)]=find_fa(fuben[1].id);
			pq.push({fuben[1].id,fuben[1].times+t});
			for(int i=2;i<=cnt;i++)pq.push(fuben[i]);
		}
	}
	farmer x=pq.top();
	printf("%lld\n",x.times);
	cnt=1;
	fuben[1].id=x.id;
	fuben[1].times=x.times;
	while(!pq.empty()&&pq.top().times==x.times)
	{
		x=pq.top();
		pq.pop();
		cnt++;
		fuben[cnt].id=x.id;
		fuben[cnt].times=x.times;				
	}
	for(int i=2;i<=cnt;i++)fa[find_fa(fuben[i].id)]=find_fa(fuben[1].id);	
	for(int i=1;i<=k;i++)
	{
		if(find_fa(i)==find_fa(x.id))printf("1");
		else printf("0");
	}
	return 0;
}
/*
6 3 
3 1 4159 2 6 5 

8 4
1 1 2 3 2 1 100 100
*/

我认为时间复杂度是 O(nlog2k)O(nlog_{2}k) 的,然而 n=300000 k=50000 的数据跑十几秒都没跑出来,求助。

2024/7/16 15:57
加载中...