rt,感觉时间复杂度 O(nlogn) 的啊,为啥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;
}