首页 > 其他分享 >P2596

P2596

时间:2024-09-11 18:51:17浏览次数:9  
标签:int register mid long char Read P2596

树状数组是个好东西

# include <bits/stdc++.h>
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
const int _(3e5 + 10), INF(2e9), PF(1e5);
inline long long Read(){
    char c = '%'; long long x = 0, z = 1;
    for(; c > '9' || c < '0'; c = getchar()) if(c == '-') z = -1;
    for(; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0';
    return x * z;
}
int n, m, t[_], id[_], a[_];
char opt[10];
inline void Add(register int x, register int v){  for(; x <= PF * 3; x += x & -x) t[x] += v;  }
inline int Query(register int x){  register int cnt = 0; for(; x; x -= x & -x) cnt += t[x]; return cnt;  }
inline int Find(register int x){
    register int l = 1, r = PF * 3;
    while(l < r){
        register int mid = (l + r) >> 1;
        if(Query(mid) >= x) r = mid;
        else l = mid + 1;
    }
    return l;
}
int main(register int argc, register char *argv[]){
    n = Read(); m = Read();
    for(register int i = 1; i <= n; ++i) a[PF + i] = Read(), Add(PF + i, 1), id[a[PF + i]] = PF + i;
    while(m--){
        scanf(" %s", opt); register int x = Read(), y, p, q;
        if(opt[0] == 'T'){
            p = Find(1);
            a[id[x]] = 0; Add(id[x], -1);
            id[x] = p - 1;
            a[id[x]] = x; Add(id[x], 1);
        }
        else if(opt[0] == 'B'){
            p = Find(n);
            a[id[x]] = 0; Add(id[x], -1);
            id[x] = p + 1;
            a[id[x]] = x; Add(id[x], 1);
        }
        else if(opt[0] == 'I'){
            y = Read(); q = Query(id[x]);
            p = Find(q + y); register int t = a[p];
            swap(a[p], a[id[x]]); swap(id[x], id[t]);
        }
        else if(opt[0] == 'A') printf("%d\n", Query(id[x]) - 1);
        else printf("%d\n", a[Find(x)]);
    }
    return 0;
}

标签:int,register,mid,long,char,Read,P2596
From: https://www.cnblogs.com/zan-mei-tai-yang/p/18408743

相关文章

  • [lnsyoj285/luoguP2596/ZJOI2006]书架
    题意维护一个长度为\(n\)的序列\(a\),进行\(m\)次操作,操作包括:将\(x\)放置于序列开头;将\(x\)放置于序列末尾;将\(x\)与其前驱/后继交换;查询\(x\)的下标\(-1\);查询下标为\(x\)的数sol维护序列,可以使用线段树或平衡树,本题使用平衡树更为简便。介于已经学习......
  • P2596 [ZJOI2006]书架 题解
    题目传送门:link。FHQ-Treap解题的关键在于如何来求出一本书上面有多少本书,但考虑到我们里面没有像权值一样的东西来让我们用按值分裂来完成这个操作,所以考虑用按排名分裂来实现。我们按照先后顺序把所有的书都给插入到平衡树里面,根据二叉搜索树的性质,当前结点的所有左子树的结......
  • P2596 [ZJOI2006]书架
    \(\color{purple}\text{P2596[ZJOI2006]书架}\)解题方法考虑使用\(\text{FHQ}\)平衡树,我们只使用编号,而不使用权值,平衡树上的先序遍历即为书的放置顺序。\(\text{Query}\):这是最简单的操作,直接查询即可。\(\text{Ask}\):本题的核心,我们知道编号,因为没有权值,没法从根往下......