• poj 2828 Buy Tickets【线段树 单点更新】


    倒着插,先不理解意思,后来看一篇题解说模拟一下

    手动模拟一下就好理解了-----

    不过话说一直写挫---一直改啊-----

    好心塞------

     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
    ",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("
    ");
    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 }
    View Code

    加油啊~~~~

  • 相关阅读:
    css3 3d 转换
    css3 动画序列
    css3 动画
    2d 转换之缩放
    2d 转换中心点
    css3 书写 动画三角形
    2d 旋转
    2D转换
    伪元素 字体图标
    风陵01
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4703390.html
Copyright © 2020-2023  润新知