为什么小根堆过不了
查看原帖
为什么小根堆过不了
199459
Masna_Kimoyo楼主2021/9/29 18:57

众所周知STL的priority_queue时间复杂度是logn

然后我用这个来代替排序

然后。。。超大时了

求神仙斧正,代码极短,一下就看完了

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int s[N];
int n,r,Q;
struct node{
	int p,num,v;
	bool operator <(const node &x)	const 
	{
		if(x.p==p)	return x.num<num;
		else	return p<x.p;
	}
};
priority_queue<node> a; 
inline int read()
{
	int x=0;
	bool w=0;
	char c=getchar();
	while(!isdigit(c))
		w|=c=='-',c=getchar();
	while(isdigit(c))
		x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return w?-x:x;
}
int main()
{
	freopen("swiss.in","r",stdin);
	freopen("swiss.out","w",stdout);
	n=read(),r=read(),Q=read();
	for(register int i=1;i<=n<<1;++i)	s[i]=read();
	for(register int i=1;i<=n<<1;++i)
	{
		int x=read();
//		cout<<s[i]<<' '<<i<<' '<<x<<endl;
		a.push((node){s[i],i,x});
	}
	while(r--)
	{
		priority_queue<node> q=a;
		while(!a.empty())	a.pop();
		for(register int i=1;i<=n;++i)
		{
			int num1=q.top().num,v1=q.top().v,p1=q.top().p;q.pop();
			int num2=q.top().num,v2=q.top().v,p2=q.top().p;q.pop();
			if(v1>v2)	++p1;
			else	++p2;
			a.push((node){p1,num1,v1});
			a.push((node){p2,num2,v2});
//			cout<<num1<<' '<<v1<<' '<<p1<<endl;
//			cout<<num2<<' '<<v2<<' '<<p2<<endl;
		}
	}
	for(register int i=1;i<Q;++i)	a.pop();
	printf("%d\n",a.top().num);
	return 0;
}

2021/9/29 18:57
加载中...