CF2001D WA on #5 求调
  • 板块题目总版
  • 楼主WaTleZero_pt
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/22 13:12
  • 上次更新2024/8/22 15:36:58
查看原帖
CF2001D WA on #5 求调
536745
WaTleZero_pt楼主2024/8/22 13:12
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> p;//pair 
typedef priority_queue<int,vector<int>,greater<int>> qs;//小根堆 
typedef priority_queue<p> qlib;//大根pair堆
typedef priority_queue<p,vector<p>,greater<p>> qlis;//小根pair堆 
int t,n,a[300010];
bool vis[300010];
int lis[300010],cnt;
int ls[300010],nxt[300010];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		cnt=0;
		for(int i=1;i<=n;i++) vis[i]=ls[i]=nxt[i]=0;
		qs q;
		for(int i=1;i<=n;i++){
			if(vis[a[i]]==0) lis[++cnt]=a[i],ls[a[i]]=i,vis[a[i]]=1;
			else nxt[ls[a[i]]]=i,ls[a[i]]=i;
		}
//		for(int i=1;i<=n;i++) printf("%d ",nxt[i]); putchar('\n');
		for(int i=1;i<=n;i++)
			if(nxt[i]==0) q.push(i);//,printf("%d ",i);
		printf("%d\n",cnt);
		qlib b; qlis s;
		int p=1;
		int ans=1;
		while(ans<=cnt){
//			printf("%d\n",q.top());
			while(!q.empty())
				if(!vis[a[q.top()]]) q.pop();
				else break;
//			printf("HERE %d\n",q.top());
			while(p<=n&&p<=q.top()){
				b.push(make_pair(a[p],-p));
				s.push(make_pair(a[p],p));
				p++;
			}
			int cur;
			while(!b.empty())
				if(!vis[b.top().first]) b.pop();
				else break;
			while(!s.empty())
				if(!vis[s.top().first]) s.pop();
				else break;
//			printf("(%d,%d,%d) ",p,b.top().second,s.top().second);
			if(ans&1) printf("%d ",b.top().first),vis[b.top().first]=0,cur=-b.top().second;
			else printf("%d ",s.top().first),vis[s.top().first]=0,cur=s.top().second;
			ans++;
			while(!b.empty())
				if(-b.top().second<=cur) b.pop();
				else break;
			while(!s.empty())
				if(s.top().second<=cur) s.pop();
				else break;
		}
		putchar('\n');
	}
	return 0;
}

2024/8/22 13:12
加载中...