之前用指针存叶节点以为能少一遍遍历 结果提交上去还慢一些!
思路:一开始看到这道题觉得应该是链表 但是时间复杂度太高了(是我太嫩了 - -)
怎么才能按要求排好序呢?答案是看题解..好吧..记住有这种用法就好了..
#include <cstdio> #include <cstring> #include <algorithm> #define lson num<<1 #define rson num<<1|1 #define gl l,(l+r)>>1,lson #define gr ((l+r)>>1)+1,r,rson using namespace std; const int maxn = 200010; struct node { bool l; ///l left int c,n; ///c count, n number }st[maxn<<3]; int lc; /// leaf count void build(int l,int r,int num) ///set leaf node and initialize save[] { st[num].c=r-l+1; st[num].n=0; //printf("build %d:%d\n",num,st[num].c); if(l==r) { //puts("end"); st[num].l=1; return; } st[num].l=0; build(gl); build(gr); } void insert(int pos,int v,int num) { //printf("now %d\n",num); st[num].c--; if(st[num].l) { st[num].n=v; return; } if(pos<st[lson].c) insert(pos,v,lson); else insert(pos-st[lson].c,v,rson); } void dfs(int num) { if(st[num].l) { if(lc++) printf(" "); printf("%d",st[num].n); return; } dfs(lson); dfs(rson); } int in[maxn][2]; int main() { //freopen("b.in","r",stdin); int n,cas=0; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d%d",&in[i][0],&in[i][1]); lc=0; build(1,n,1); for(int i=n-1;i>=0;i--) insert(in[i][0],in[i][1],1); lc=0; if(cas++) puts(""); dfs(1); } return 0; }