• POJ 2828Buy Tickets


    POJ 2828

    题目大意是说有n个插入操作,每次把B插入到位置A,原来A以后的全部往后移动1,球最后的序列

    tree里保存的应该是这整个区间还有多扫个位置可以插入数据,那么线段树里从后往前扫描依次插入数据

    比如现在吧B插入到A位置,如果整个区间左侧还有<A个位置可以插入数据,那么就只能将其放到整个区间的右侧,递归下去就可以了

     1 void update(int k, int L, int R, int x)
     2 {
     3     if(L == R) { pre[k] = r; ans[L] = val; return ; }
     4 
     5     int mid = (L+R)>>1;
     6 
     7     if(x <= pre[k<<1]) update(lson, x);//左侧的多余x
     8 
     9     else update(rson, x-pre[k<<1]);//否则往右
    10 
    11      pre[k] = pre[k<<1] + pre[k<<1|1];
    12 }
     1 #include <map>
     2 #include <set>
     3 #include <stack>
     4 #include <queue>
     5 #include <cmath>
     6 #include <ctime>
     7 #include <vector>
     8 #include <cstdio>
     9 #include <cctype>
    10 #include <cstring>
    11 #include <cstdlib>
    12 #include <iostream>
    13 #include <algorithm>
    14 using namespace std;
    15 #define INF 1e9
    16 #define inf (-((LL)1<<40))
    17 #define lson k<<1, L, mid
    18 #define rson k<<1|1, mid+1, R
    19 #define mem0(a) memset(a,0,sizeof(a))
    20 #define mem1(a) memset(a,-1,sizeof(a))
    21 #define mem(a, b) memset(a, b, sizeof(a))
    22 #define FOPENIN(IN) freopen(IN, "r", stdin)
    23 #define FOPENOUT(OUT) freopen(OUT, "w", stdout)
    24 template<class T> T CMP_MIN(T a, T b) { return a < b; }
    25 template<class T> T CMP_MAX(T a, T b) { return a > b; }
    26 template<class T> T MAX(T a, T b) { return a > b ? a : b; }
    27 template<class T> T MIN(T a, T b) { return a < b ? a : b; }
    28 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
    29 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b;    }
    30 
    31 typedef __int64 LL;
    32 //typedef long long LL;
    33 const int MAXN = 200005;
    34 const int MAXM = 100005;
    35 const double eps = 1e-10;
    36 const LL MOD = 1000000007;
    37 
    38 int N, pre[MAXN<<2];
    39 int id[MAXN], num[MAXN], ans[MAXN];
    40 int r, val;
    41 
    42 int buildTree(int k, int L, int R)
    43 {
    44     if(L == R) return pre[k] = 1;
    45     int mid = (L+R)>>1;
    46     return pre[k] = buildTree(lson) + buildTree(rson);
    47 }
    48 
    49 void update(int k, int L, int R, int x)
    50 {
    51     if(L == R) { pre[k] = r; ans[L] = val; return ; }
    52 
    53     int mid = (L+R)>>1;
    54 
    55     if(x <= pre[k<<1]) update(lson, x);
    56 
    57     else update(rson, x-pre[k<<1]);
    58 
    59      pre[k] = pre[k<<1] + pre[k<<1|1];
    60 }
    61 
    62 int main()
    63 {
    64     while(~scanf("%d", &N))
    65     {
    66         buildTree(1, 1, N);
    67         for(int l=1;l<=N;l++)
    68             scanf("%d %d", &id[l], &num[l]);
    69         r = 0;
    70         for(int i=N;i>0;i--)
    71         {
    72             val = num[i];
    73             update(1, 1, N, id[i] + 1);
    74         }
    75         for(int i=1;i<=N;i++) printf("%d%c", ans[i], i==N?'
    ':' ');
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    防窜货下加密锁使用常见问题
    SQL Server 2000/2005/2008 触发器的管理和查看
    列表显示时,部分凭证会分两行显示,且不能删除
    JDBC 连接 带实例名的SQL Server
    登录软件提示:读取数据源出现错误,pkcs7填充无效,无法被移除
    完美卸载SQL Server 2008的方案
    彻底卸载(删除)SQL server2000
    NCV5取消:授权数到达,或者许可证过期提示的秘诀
    SQL Server日志清空方法 .
    第二天 一列布局
  • 原文地址:https://www.cnblogs.com/gj-Acit/p/3884663.html
Copyright © 2020-2023  润新知