zoukankan      html  css  js  c++  java
  • Dynamic Rankings(动态第k大+树套树)

    题目链接:

      http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112

    题目:

    思路:

      树套树板子题。

    代码实现如下:

      1 #include <set>
      2 #include <map>
      3 #include <deque>
      4 #include <queue>
      5 #include <stack>
      6 #include <cmath>
      7 #include <ctime>
      8 #include <bitset>
      9 #include <cstdio>
     10 #include <string>
     11 #include <vector>
     12 #include <cstdlib>
     13 #include <cstring>
     14 #include <iostream>
     15 #include <algorithm>
     16 using namespace std;
     17 
     18 typedef long long LL;
     19 typedef pair<LL, LL> pLL;
     20 typedef pair<LL, int> pLi;
     21 typedef pair<int, LL> pil;;
     22 typedef pair<int, int> pii;
     23 typedef unsigned long long uLL;
     24 
     25 #define lson rt<<1
     26 #define rson rt<<1|1
     27 #define lowbit(x) x&(-x)
     28 #define name2str(name) (#name)
     29 #define bug printf("*********
    ")
     30 #define debug(x) cout<<#x"=["<<x<<"]" <<endl
     31 #define FIN freopen("D://code//in.txt","r",stdin)
     32 #define IO ios::sync_with_stdio(false),cin.tie(0)
     33 
     34 const double eps = 1e-8;
     35 const int mod = 1000000007;
     36 const int maxn = 5e4 + 7;
     37 const double pi = acos(-1);
     38 const int inf = 0x3f3f3f3f;
     39 const LL INF = 0x3f3f3f3f3f3f3f3fLL;
     40 
     41 char op[5];
     42 int n, q, x, y, tot1, tot2, cnt;
     43 int a[maxn], q1[maxn], q2[maxn], root1[maxn], root2[maxn];
     44 vector<int> v;
     45 
     46 struct que {
     47     int op, l, r, x;
     48 }ask[maxn];
     49 
     50 struct node {
     51     int l, r, sum;
     52 }tree[maxn*40];
     53 
     54 int getid(int x) {
     55     return lower_bound(v.begin(), v.end(), x) - v.begin() + 1;
     56 }
     57 
     58 void update(int l, int r, int& x, int y, int pos, int val) {
     59     tree[++cnt] = tree[y], tree[cnt].sum += val, x = cnt;
     60     if(l == r) return;
     61     int mid = (l + r) >> 1;
     62     if(pos <= mid) update(l, mid, tree[x].l, tree[y].l, pos, val);
     63     else update(mid + 1, r, tree[x].r, tree[y].r, pos, val);
     64 }
     65 
     66 int query(int l, int r, int x, int y, int k) {
     67     if(l == r) return l;
     68     int cnt = tree[tree[y].l].sum - tree[tree[x].l].sum;
     69     for(int i = 0; i < tot1; ++i) {
     70         cnt -= tree[tree[q1[i]].l].sum;
     71     }
     72     for(int i = 0; i < tot2; ++i) {
     73         cnt += tree[tree[q2[i]].l].sum;
     74     }
     75     int mid = (l + r) >> 1;
     76     if(cnt >= k) {
     77         for(int i = 0; i < tot1; ++i) {
     78             q1[i] = tree[q1[i]].l;
     79         }
     80         for(int i = 0; i < tot2; ++i) {
     81             q2[i] = tree[q2[i]].l;
     82         }
     83         return query(l, mid, tree[x].l, tree[y].l, k);
     84     } else {
     85         for(int i = 0; i < tot1; ++i) {
     86             q1[i] = tree[q1[i]].r;
     87         }
     88         for(int i = 0; i < tot2; ++i) {
     89             q2[i] = tree[q2[i]].r;
     90         }
     91         return query(mid + 1, r, tree[x].r, tree[y].r, k - cnt);
     92     }
     93 }
     94 
     95 int main(){
     96 #ifndef ONLINE_JUDGE
     97     FIN;
     98 #endif
     99     int t;
    100     scanf("%d", &t);
    101     while(t--) {
    102         scanf("%d%d", &n, &q);
    103         cnt = tot1 = tot2 = 0;
    104         v.clear();
    105         memset(root2, 0, sizeof(root2));
    106         for(int i = 1; i <= n; ++i) {
    107             scanf("%d", &a[i]);
    108             v.push_back(a[i]);
    109         }
    110         for(int i = 1; i <= q; ++i) {
    111             scanf("%s", op);
    112             if(op[0] == 'C') ask[i].op = 1;
    113             else ask[i].op = 2;
    114             if(ask[i].op == 1) {
    115                 scanf("%d%d", &ask[i].l, &ask[i].x);
    116                 v.push_back(ask[i].x);
    117             } else {
    118                 scanf("%d%d%d", &ask[i].l, &ask[i].r, &ask[i].x);
    119             }
    120         }
    121         sort(v.begin(), v.end());
    122         v.erase(unique(v.begin(), v.end()), v.end());
    123         int sz = v.size();
    124         for(int i = 1; i <= n; ++i) {
    125             a[i] = getid(a[i]);
    126             update(1, sz, root1[i], root1[i-1], a[i], 1);
    127         }
    128         for(int i = 1; i <= q; ++i) {
    129             int op = ask[i].op;
    130             if(op == 1) {
    131                 int pos = ask[i].l, x = ask[i].x, y = a[pos];
    132                 x = getid(x);
    133                 a[pos] = x;
    134                 while(pos <= n) {
    135                     update(1, sz, root2[pos], root2[pos], y, -1);
    136                     update(1, sz, root2[pos], root2[pos], x, 1);
    137                     pos += lowbit(pos);
    138                 }
    139             } else {
    140                 int l = ask[i].l, r = ask[i].r, k = ask[i].x;
    141                 int x = l - 1;
    142                 tot1 = tot2 = 0;
    143                 while(x) {
    144                     q1[tot1++] = root2[x];
    145                     x -= lowbit(x);
    146                 }
    147                 x = r;
    148                 while(x) {
    149                     q2[tot2++] = root2[x];
    150                     x -= lowbit(x);
    151                 }
    152                 printf("%d
    ", v[query(1, sz, root1[l-1], root1[r], k)-1]);
    153             }
    154         }
    155     }
    156     return 0;
    157 }
  • 相关阅读:
    Git问题(Your local changes to the followingcant checkout because of unmerged files)
    Java实体映射工具 MapStruct
    获取一段代码执行花费的时长
    mybatis的xml中trim标签
    SQL语句统计每天、每月、每年的数据
    Java常见异常
    跨域与跨域访问
    java8新特性
    java中i=i++问题分析
    钉钉——第三方应用嵌入钉钉【微应用】
  • 原文地址:https://www.cnblogs.com/Dillonh/p/10727234.html
Copyright © 2011-2022 走看看