UVA 11990``Dynamic'' Inversion(树套树)
来源:互联网 发布:淘宝网店运费怎么设置 编辑:程序博客网 时间:2024/05/16 05:55
树状数组套treap
#include <bits/stdc++.h>#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;#define LL long long #define pii pair<int, int>#define MP make_pair#define ls i << 1#define rs ls | 1#define md (ll + rr >> 1)#define lson ll, md, ls#define rson md + 1, rr, rs#define inf 0x3f3f3f3f#define mod 1000000007#define N 300010#define M 400020int readint() { char c; while((c = getchar()) && !(c >= '0' && c <= '9') && c != '-'); int ret = c - '0', sgn = 0; if(c == '-') sgn = 1, ret = 0; while((c = getchar()) && c >= '0' && c <= '9') ret = ret * 10 + c - '0'; if(sgn) ret = -ret; return ret;}int ch[N*25][2]; int rand_val[N*25], key[N*25], sz[N*25]; int tot, rt[N], a[N], n, m, s[N], id[N];int creat(int val) { ++tot; ch[tot][0] = ch[tot][1] = 0; rand_val[tot] = rand(); key[tot] = val; sz[tot] = 1; return tot; }int cmp(int x, int val) { if(key[x] == val) return -1; return val < key[x]? 0: 1; }void push_up(int x) { sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1; } void rot(int &x, int d) { int k = ch[x][!d]; ch[x][!d] = ch[k][d]; ch[k][d] = x; push_up(x); push_up(k); x = k; } void insert(int &x, int val) { if(x == 0) { x = creat(val); return; } int d = cmp(x, val); if(d == -1) d = 1; insert(ch[x][d], val); if(rand_val[ch[x][d]] > rand_val[x]) rot(x, d ^ 1); push_up(x); } void del(int &x, int val) { if(x == 0) return; int d = cmp(x, val); if(d == -1) { if(!ch[x][0]) x = ch[x][1]; else if(!ch[x][1]) x = ch[x][0]; else { int d2 = rand_val[ch[x][0]] > rand_val[ch[x][1]]? 1: 0; rot(x, d2); del(ch[x][d2], val); } } else del(ch[x][d], val); if(x) push_up(x); } int kth_mi(int x, int val){ if(!x) return 0; int d = cmp(x, val); if(d <= 0) return kth_mi(ch[x][0], val); return sz[ch[x][0]] + 1 + kth_mi(ch[x][1], val);}int kth_mx(int x, int val){ if(!x) return 0; int d = cmp(x, val); if(d == -1 || d == 1) return kth_mx(ch[x][1], val); return sz[ch[x][1]] + 1 + kth_mx(ch[x][0], val);}void add(int x, int v){ for(; x <= n; x += x & -x) s[x] += v;}int query(int x){ int ret = 0; for(; x > 0; x -= x & -x) ret += s[x]; return ret;}void build(){ for(int i = 1; i <= n; ++i) for(int j = i; j <= n; j += j & -j) insert(rt[j], a[i]);}void update(int x, int val){ for(; x <= n; x += x & -x) del(rt[x], val);}int sum_mi(int x, int val){ int ret = 0; for(; x > 0; x -= x & -x) ret += kth_mi(rt[x], val); return ret;}int sum_mx(int x, int val){ int ret = 0; for(; x > 0; x -= x & -x) ret += kth_mx(rt[x], val); return ret;}int main(){ while(scanf("%d%d", &n, &m) != EOF){ tot = 0; for(int i = 1; i <= n; ++i){ scanf("%d", &a[i]); rt[i] = s[i] = 0; id[a[i]] = i; } LL ans = 0; for(int i = n; i > 0; --i){ ans += query(a[i]); add(a[i], 1); } build(); while(m--){ printf("%lld\n", ans); int v; scanf("%d", &v); int L = sum_mx(id[v], v); int R = sum_mi(n, v) - sum_mi(id[v]-1, v); update(id[v], v); ans -= (L + R); } } return 0;}
0 0
- UVA 11990``Dynamic'' Inversion(树套树)
- [Uva 11990] "Dynamic" Inversion (二维分块)
- 【UVA, 11990】“Dynamic” Inversion【平方分割n】
- [Uva 11990] "Dynamic" Inversion (CDQ分治入门)
- Uva 11990 ``Dynamic'' Inversion(分桶法+平方分割)
- Uva 11990 "Dynamic" Inversion(树状数组 + 数据结构分块)
- UVA11990 ``Dynamic'' Inversion 树套树
- spoj 861 SWAPS & uva 11990 "Dynamic'' Inversion(动态维护逆序对)
- UVA11990--"Dynamic"Inversion
- 动态逆序对,Dynamic Inversion,Uva11990(树套树)
- uva 11157 Dynamic Frog
- uva 11157 Dynamic Frog
- uva11990 - ``Dynamic'' Inversion(线段树套树状数组+分块)
- UVA11990 ``Dynamic'' Inversion (树状数组套平衡树)
- 【题解】【uva11990】【bzoj3295】动态逆序对 ``Dynamic'' Inversion
- uva 11157 Dynamic Frog (贪心)
- inversion
- Inversion
- RNN学习笔记(六)-GRU,LSTM 代码实现
- 文章标题
- HDU-1210Eddy's 洗牌问题
- java虚拟机学习之内存管理
- Count Primes
- UVA 11990``Dynamic'' Inversion(树套树)
- Java连接Redis
- 输入adb shell 时 提示error: more than one device and emulator
- ssm框架搭建三---mybatis打印sql
- AndroidStudio 集成海康威视 Android SDK,即集成萤石Android SDK。
- Swift函数柯里化(Currying)简谈
- [动态树 LCT] BZOJ 2157 旅游
- JBOSS安装配置并搭建本地开发环境
- 求最长回文子串,O(n)复杂度