• POJ 3667 线段树


    链接:

    http://poj.org/problem?id=3667

    代码:

      1 #include <map>
      2 #include <set>
      3 #include <cmath>
      4 #include <queue>
      5 #include <stack>
      6 #include <cstdio>
      7 #include <string>
      8 #include <vector>
      9 #include <cstdlib>
     10 #include <cstring>
     11 #include <sstream>
     12 #include <iostream>
     13 #include <algorithm>
     14 #include <functional>
     15 using namespace std;
     16 #define rep(i,a,n) for (int i=a;i<n;i++)
     17 #define per(i,a,n) for (int i=n-1;i>=a;i--)
     18 #define all(x) (x).begin(),(x).end()
     19 #define pb push_back
     20 #define mp make_pair
     21 #define lson l,m,rt<<1  
     22 #define rson m+1,r,rt<<1|1 
     23 typedef long long ll;
     24 typedef vector<int> VI;
     25 typedef pair<int, int> PII;
     26 const ll MOD = 1e9 + 7;
     27 const int INF = 0x3f3f3f3f;
     28 const int MAXN = 5e4 + 7;
     29 // head
     30 
     31 int cover[MAXN << 2];
     32 int lsum[MAXN << 2], rsum[MAXN << 2], msum[MAXN << 2];
     33 
     34 void pushup(int rt, int m) {
     35     lsum[rt] = lsum[rt << 1], rsum[rt] = rsum[rt << 1 | 1];
     36     if (lsum[rt << 1] == m - (m >> 1)) lsum[rt] += lsum[rt << 1 | 1];
     37     if (rsum[rt << 1 | 1] == m >> 1) rsum[rt] += rsum[rt << 1];
     38     msum[rt] = max(max(msum[rt << 1], msum[rt << 1 | 1]), rsum[rt << 1] + lsum[rt << 1 | 1]);
     39 }
     40 
     41 void pushdown(int rt, int m) {
     42     if (cover[rt] != -1) {
     43         cover[rt << 1] = cover[rt << 1 | 1] = cover[rt];
     44         lsum[rt << 1] = rsum[rt << 1] = msum[rt << 1] = (cover[rt] ? 0 : m - (m >> 1));
     45         lsum[rt << 1 | 1] = rsum[rt << 1 | 1] = msum[rt << 1 | 1] = (cover[rt] ? 0 : m >> 1);
     46         cover[rt] = -1;
     47     }
     48 }
     49 
     50 void build(int l, int r, int rt) {
     51     cover[rt] = -1;
     52     lsum[rt] = rsum[rt] = msum[rt] = r - l + 1;
     53     if (l == r) return;
     54     int m = (l + r) >> 1;
     55     build(lson);
     56     build(rson);
     57 }
     58 
     59 void update(int L, int R, int x, int l, int r, int rt) {
     60     if (L <= l && r <= R) {
     61         cover[rt] = x;
     62         lsum[rt] = rsum[rt] = msum[rt] = (x ? 0 : r - l + 1);
     63         return;
     64     } 
     65     pushdown(rt, r - l + 1);
     66     int m = (l + r) >> 1;
     67     if (L <= m) update(L, R, x, lson);    
     68     if (R > m) update(L, R, x, rson);
     69     pushup(rt, r - l + 1);
     70 }
     71 
     72 int query(int x, int l, int r, int rt) {
     73     if (l == r) return l;
     74     pushdown(rt, r - l + 1);
     75     int m = (l + r) >> 1;
     76     if (msum[rt << 1] >= x) return query(x, lson);
     77     else if (rsum[rt << 1] + lsum[rt << 1 | 1] >= x) return m - rsum[rt << 1] + 1;
     78     else query(x, rson);
     79 }
     80 
     81 int main() {
     82     int n, m;
     83     cin >> n >> m;
     84     build(1, n, 1);
     85     while (m--) {
     86         int a, b, c;
     87         scanf("%d", &a);
     88         if (a == 1) {
     89             scanf("%d", &b);
     90             if (msum[1] < b) {
     91                 puts("0");
     92                 continue;
     93             }
     94             int ans = query(b, 1, n, 1);
     95             printf("%d
    ", ans);
     96             update(ans, ans + b - 1, 1, 1, n, 1);
     97         }
     98         else {
     99             scanf("%d%d",&b, &c);
    100             update(b, b + c - 1, 0, 1, n, 1);
    101         }
    102     }
    103     return 0;
    104 }
  • 相关阅读:
    BZOJ 3330 分数
    FR #11题解
    BZOJ 1857 传送带
    BZOJ 4757 Building a Tall Barn
    FR #10题解
    BZOJ 4393 Fruit Feast
    BZOJ 3126 Photo
    BZOJ 1312 Hard Life
    BZOJ 2039 employ人员雇佣
    Count SIN Numbers
  • 原文地址:https://www.cnblogs.com/baocong/p/6700285.html
Copyright © 2020-2023  润新知