噗,认识了一种神奇的数据结构。。
水。。反正有SBT的性质就排序。。然后地轨+RMQ。。
输出中间变量没删WA了一版23333

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 #include<queue> 7 #define inc(i,l,r) for(i=l;i<=r;i++) 8 #define dec(i,l,r) for(i=l;i>=r;i--) 9 #define inf 1e9 10 #define mem(a) memset(a,0,sizeof(a)) 11 #define ll long long 12 #define succ(x) (1<<x) 13 #define NM 50000+5 14 using namespace std; 15 int read(){ 16 int x=0,f=1;char ch=getchar(); 17 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 18 while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); 19 return x*f; 20 } 21 struct tmp{ 22 int a,k,num; 23 }a[NM]; 24 int ans[NM][3],d[NM][20],n,i,j,p; 25 bool cmp(tmp x,tmp y){ 26 return x.k<y.k; 27 } 28 int _min(int x,int y){ 29 return a[x].a<a[y].a?x:y; 30 } 31 int minn(int l,int r){ 32 int k=log(r-l+1.0)/log(2.0); 33 return _min(d[l][k],d[r-succ(k)+1][k]); 34 } 35 int dfs(int x,int l,int r){ 36 if(l>r)return 0; 37 int t=minn(l,r); 38 ans[a[t].num][0]=a[x].num; 39 if(l==r)return a[t].num; 40 int v=dfs(t,l,t-1); 41 ans[a[t].num][1]=v; 42 v=dfs(t,t+1,r); 43 ans[a[t].num][2]=v; 44 // printf("%d %d %d %d ",a[t].num,ans[a[t].num][0],ans[a[t].num][1],ans[a[t].num][2]); 45 return a[t].num; 46 } 47 int main(){ 48 while(~scanf("%d",&n)){ 49 inc(i,1,n){ 50 a[i].k=read(); 51 a[i].a=read(); 52 a[i].num=i; 53 } 54 sort(a+1,a+1+n,cmp); 55 inc(i,1,n)d[i][0]=i; 56 p=log(n+1.0)/log(2.0); 57 inc(j,1,p) 58 for(i=1;i+succ(j-1)-1<=n;i++) 59 d[i][j]=_min(d[i][j-1],d[i+succ(j-1)][j-1]); 60 i=minn(1,n); 61 j=dfs(i,1,i-1); 62 ans[a[i].num][1]=j; 63 j=dfs(i,i+1,n); 64 ans[a[i].num][2]=j; 65 // printf("%d %d %d ",ans[i][0],ans[i][1],ans[i][2]); 66 printf("YES "); 67 inc(i,1,n)printf("%d %d %d ",ans[i][0],ans[i][1],ans[i][2]); 68 } 69 return 0; 70 }