标签:
倒着插,先不理解意思,后来看一篇题解说模拟一下
手动模拟一下就好理解了-----
不过话说一直写挫---一直改啊-----
好心塞------
1 #include <cstdio> 2 #include <ctime> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <vector> 7 #include <map> 8 #include <set> 9 #include <stack> 10 #include <queue> 11 #include <string> 12 #include <iostream> 13 #include <algorithm> 14 using namespace std; 15 16 #define getmid(l,r) ((l) + ((r) - (l)) / 2) 17 18 typedef long long LL; 19 const double eps = 1e-8; 20 const int INF = (1 << 30) - 1; 21 const int maxn = 200005; 22 23 struct node{ 24 int l,r,s; 25 }t[4*maxn]; 26 27 struct Edge{ 28 int pos,val; 29 }a[maxn]; 30 31 int n; 32 int ans[maxn]; 33 34 void Push_up(int p){ 35 t[p].s = t[p<<1].s + t[p<<1|1].s; 36 } 37 38 39 void Build_tree(int p,int l,int r){ 40 t[p].l = l; 41 t[p].r = r; 42 if(l == r){ 43 t[p].s = 1; 44 return; 45 } 46 int mid = getmid(l,r); 47 Build_tree(p<<1,l,mid); 48 Build_tree(p<<1|1,mid+1,r); 49 Push_up(p); 50 } 51 52 void update(int idx,int p){ 53 if(t[p].l == t[p].r){ 54 t[p].s--; 55 return; 56 } 57 int mid = getmid(t[p].l,t[p].r); 58 if(idx <= mid) update(idx,p<<1); 59 else update(idx,p<<1|1); 60 Push_up(p); 61 } 62 63 int query(int idx,int p){ 64 if(t[p].l == t[p].r) return t[p].l; 65 if(t[p<<1].s >= idx) return query(idx,p<<1); 66 else return query(idx-t[p<<1].s,p<<1|1); 67 } 68 69 void solve(){ 70 Build_tree(1,1,n); 71 // for(int i = 1;i <= 2*n;i++) 72 // printf("t[%d].l = %d t[%d].r = %d t[%d].s = %d\n",i,t[i].l,i,t[i].r,i,t[i].s); 73 for(int i = n;i >= 1;i--){ 74 int pos = a[i].pos; 75 int id = query(pos,1); 76 ans[id] = a[i].val; 77 update(id,1); 78 } 79 printf("%d",ans[1]); 80 for(int i = 2;i <= n;i++) printf(" %d",ans[i]); 81 printf("\n"); 82 } 83 84 int main(){ 85 while(scanf("%d",&n) != EOF){ 86 for(int i = 1;i <= n;i++){ 87 scanf("%d %d",&a[i].pos,&a[i].val); 88 a[i].pos++; 89 } 90 solve(); 91 } 92 return 0; 93 }
加油啊~~~~
poj 2828 Buy Tickets【线段树 单点更新】
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4703390.html