标签:线段树
给你一个数列出现的先后顺序num【i】和对应数值 输出最后排好序的对应数值,如
4
0 77
1 51
1 33
2 69
第一步 77
第二部 77 51
第三步 77 33 51
第四部77 33 69 51
后面先出现的位置是固定的 所以从后往前处理。 线段树每个节点存当前区间还有多少个空位;
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define LL(x) (x<<1) #define RR(x) ((x<<1)|1) struct node { int cont; }tree[4*200000]; int num[200010][3],queue[200010]; int deal(int L,int R,int point) { tree[point].cont=R-L+1; if(L==R)return 0; int mid=(L+R)/2; deal(L,mid,LL(point)); deal(mid+1,R,RR(point)); return 0; } int update(int L,int R,int pos,int point,int value) { tree[point].cont--; if(L==R) { queue[L]=value; return 0; } int mid=(L+R)/2; if(pos<=tree[LL(point)].cont) update(L,mid,pos,LL(point),value); else update(mid+1,R,pos-tree[LL(point)].cont,RR(point),value); return 0; } int main() { int n,i,j; while(~scanf("%d",&n)) { deal(1,n,1); for(i=1;i<=n;i++) { scanf("%d%d",&num[i][1],&num[i][2]); num[i][1]++; } for(i=n;i>=1;i--) { update(1,n,num[i][1],1,num[i][2]); } for(i=1;i<=n;i++) { if(i!=1) printf(" "); printf("%d",queue[i]); } printf("\n"); } return 0; }
标签:线段树
原文地址:http://blog.csdn.net/zxf654073270/article/details/45648669