TLE on #31
查看原帖
TLE on #31
416192
kbzcz楼主2024/10/9 20:24

rt,感觉时间复杂度 O(nlogn)O(n\log n) 的啊,为啥TLE。

bool _Start;
#include <bits/stdc++.h>
using namespace std;
#define il inline
#define pb push_back
#define debug printf("How can I be successful?\n")
#define Tp template<typename T>
#define Ts template<typename T,typename... _T>
Tp il void read(T& x) {
	x=0;bool f=0;char c=getchar();
 	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	x=(f?-x:x);
}Ts il void read(T& x,_T&... y) {read(x),read(y...);}
const int N=6e5+5;
int n,a[N];
int len,ans[N],last[N];
bool vis[N];
multiset<int> s;
vector<int> pos[N];
struct node {
	int mx,mn;
	node(int x=0,int y=1e9) {mx=x,mn=y;}
	il friend node operator+(node x,node y) {
		node z;
		z.mx=max(x.mx,y.mx);
		z.mn=min(x.mn,y.mn);
		return z;
	}
};
struct Segtr {
	int ls,rs;
	node x;
}seg[N<<1];int trlen;
il void pushup(int p) {seg[p].x=seg[seg[p].ls].x+seg[seg[p].rs].x;}
int bt(int l,int r) {
	int p=++trlen;
	if(l==r) return seg[p].x=node(a[l],a[l]),p;
	int mid=(l+r)>>1;
	seg[p].ls=bt(l,mid);
	seg[p].rs=bt(mid+1,r);
	pushup(p);
	return p;
}
void change(int l,int r,int p,int x) {
	if(l==r) {
		seg[p].x=node();
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid) change(l,mid,seg[p].ls,x);
	else change(mid+1,r,seg[p].rs,x);
	pushup(p);
}
node query(int l,int r,int p,int x,int y) {
	if(l==r) return seg[p].x;
	int mid=(l+r)>>1;
	node ans=node();
	if(x<=mid) ans=ans+query(l,mid,seg[p].ls,x,y);
	if(y>mid) ans=ans+query(mid+1,r,seg[p].rs,x,y);
	return ans;
}
bool _End;
int main() {
	fprintf(stderr,"Memory: %.4lf Mib\n",(&_End-&_Start)/1048576.0);
	int _;read(_);
	while(_--) {
		read(n);
		s.clear(); 
		for(int i=1;i<=n;i++) pos[i].clear(),last[i]=vis[i]=0;
		for(int i=1;i<=n;i++) read(a[i]),pos[a[i]].pb(i);
		for(int i=n;i>=1;i--) {
			if(!last[a[i]])
				last[a[i]]=i,s.insert(i);	
		}
		len=s.size();
		trlen=0;bt(1,n);
		for(int i=1,l=1;i<=len;i++) {
			int r=*s.begin();
			if(i&1) ans[i]=query(1,n,1,l,r).mx;
			else ans[i]=query(1,n,1,l,r).mn;
			int ix=-1;
			for(int j=0;j<pos[ans[i]].size();j++) {
				if(ix==-1&&pos[ans[i]][j]>=l) ix=j;
				change(1,n,1,pos[ans[i]][j]);
			}
			l=pos[ans[i]][ix]+1;
			s.erase(last[ans[i]]);
		}
		printf("%d\n",len);
		for(int i=1;i<=len;i++) printf("%d ",ans[i]);
		puts("");
	}
	return 0;
}

2024/10/9 20:24
加载中...