题目要求可转化为查询一个区间内有多少数比val大(或者小)。

区间用线段树分解(logN),每个区间维护一rank树。

rank可用BIT查询,往BIT里面插值,为了保证不同区间的BIT互不影响要先离散。

首先进行分治,分治的同时归并排序完成离散并计算保存出每个元素和其他元素构成的逆序对iv[i]。(据说这叫归并树

初始值将所有iv求和,一个对被算了两次所以除以二。

每次删除元素val就减去val对应的逆序对。

减去iv[val],但是多减去了和之前删掉元素构成的逆序对(这些逆序对已经算过一次)。

所以把删掉的元素加到线段树里面。

减去当前iv[val]之后,查询并加上当前元素val和之前位置以及之后位置构成逆序对。

复杂度

O(nlogn)预处理,O(m*logn*logn)回答

#include<bits/stdc++.h>
using namespace std; const int maxn = 2e5+, LogN = ; typedef long long ll;
ll invPair;
int a[maxn],p[maxn];
int iv[maxn];
int n; int s[maxn<<];
int C[LogN][maxn];
int Set[LogN][maxn]; #define para int o = 1, int l = 1,int r = n,int dep = 0
#define lo (o<<1)
#define ro (o<<1|1)
#define TEMP int mid = (l+r)>>1, lc = lo, rc = ro;
#define lsn lc, l, mid, dep+1
#define rsn rc, mid+1, r, dep+1 #define lb(x) ((x)&-(x))
int sum(int C[],int x)
{
int re = ;
while(x>){
re += C[x];
x -= lb(x);
}
return re;
} void add(int C[],int x,int d,int r)
{
while(x<=r){
C[x] += d;
x += lb(x);
}
} int qpos;
int ql,qr,val;
void queryPrefix(para)
{
if(<=l&&r<=qr){
int pos = upper_bound(Set[dep]+l,Set[dep]+r+,val)-Set[dep]-l;//等于等于val的最大元素的编号
invPair += s[o] - sum(C[dep]+l-,pos);//得到大于val的元素个数
}else {
TEMP
queryPrefix(lsn);
if(qr>mid) queryPrefix(rsn);
}
} void querySuffix(para)
{
if(ql<=l&&r<=n){
int pos = lower_bound(Set[dep]+l,Set[dep]+r+,val)-Set[dep]-l;//严格小于val的元素的编号
invPair += sum(C[dep]+l-,pos);
}else {
TEMP
if(ql<=mid) querySuffix(lsn);
querySuffix(rsn);
}
} void modify(para)
{
s[o]++;
if(l == r){
C[dep][l] = ;
}else{
TEMP
if(qpos<=mid) modify(lsn);
else modify(rsn);
int pos = upper_bound(Set[dep]+l,Set[dep]+r+,val)-Set[dep]-l;//val在set里,从1开始编号
add(C[dep]+l-,pos,,r-l+);//l-1是0号位,容纳r-l+1个元素
}
} //为保证BIT之间互不影响,merge_sort离散,同时计算逆序对
void discretize(para)
{
s[o] = ;
memset(C[dep]+l,,sizeof(int)*(r-l+));
if(l == r) {
Set[dep][l] = a[l];
return;
}else {
TEMP;
discretize(lsn);
discretize(rsn);
int p = l, q = mid+, k = l;
while(p<=mid || q<=r){
if(q > r|| (p <= mid && Set[dep+][p] <= Set[dep+][q]) ){
iv[Set[dep+][p]] += k-p;//和后面的数构成逆序对
Set[dep][k++] = Set[dep+][p++];
}else {
iv[Set[dep+][q]] += mid-p+;//和前面的数构成逆序对
Set[dep][k++] = Set[dep+][q++];
}
}
}
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
int m;
while(~scanf("%d%d",&n,&m)){
memset(iv+,,sizeof(int)*n);
for(int i = ; i <= n; i++){
scanf("%d",a+i);
p[a[i]] = i;
}
invPair = ;
discretize();
for(int i = ; i <= n; i++){
invPair += iv[i];
}
invPair >>= ;
while(m--){
scanf("%d",&val);
printf("%lld\n",invPair);
invPair -= iv[val];
qr = p[val]-;
ql = p[val]+;
if(qr>=) queryPrefix();
if(ql<=n) querySuffix();
qpos = p[val];
modify();
}
}
return ;
}

UVA 11990 ``Dynamic'' Inversion (线段树套BIT,分治)的更多相关文章

  1. UVA 11990 ”Dynamic“ Inversion(线段树+树状数组)

    [题目链接] UVA11990 [题目大意] 给出一个数列,每次删去一个数,求一个数删去之前整个数列的逆序对数. [题解] 一开始可以用树状数组统计出现的逆序对数量 对于每个删去的数,我们可以用线段树 ...

  2. UVA 11990 ``Dynamic'' Inversion 动态逆序对

    ``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index ...

  3. uva 12003 Array Transformer (线段树套平衡树)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  4. BZOJ.1901.Dynamic Rankings(线段树套平衡树 Splay)

    题目链接or Here 题意:n个数,有两个操作:1.修改某个数为v:2.询问一段区间第k小的数 如果没有修改,则可以用线段树,每个节点P[a,b]存储大小为b-a+1的数组,代表其中的数 同时,这个 ...

  5. UVA 11990 ``Dynamic'' Inversion (序列分治)

    26天以前做过的一道题,之前的做法是分治预处理,树套树在线修改,复杂度为O(nlogn+m*logn*logn),代码量较大. 本来想学习一下cdq分治的,看到论文上的凸包.斜率就暂时放一边了,只知道 ...

  6. UVA 11990 `Dynamic'' Inversion CDQ分治, 归并排序, 树状数组, 尺取法, 三偏序统计 难度: 2

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  7. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  8. BZOJ 1901: Zju2112 Dynamic Rankings 区间k大 带修改 在线 线段树套平衡树

    之前写线段树套splay数组版..写了6.2k..然后弃疗了.现在发现还是很水的..嘎嘎.. zju过不了,超时. upd:才发现zju是多组数据..TLE一版才发现.然后改了,MLE...手写内存池 ...

  9. 树套树Day1线段树套平衡树bzoj3196

    您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查 ...

随机推荐

  1. webpack@3.6.0(1) -- 快速开始

    本篇内容 前言 配置入口和输出 热更新 loader配置 js代码压缩 html的打包与发布 前言 //全局安装 npm install -g webpack(3.6.0) npm init //安装 ...

  2. MongoDB的安装避坑(踩坑)

    下载 可以去官网下载:https://www.mongodb.com/download-center/community 安装 下载完了就可以使用安装包安装:我下载的mongodb版本是:v4.0.9 ...

  3. Solr 6.7学习笔记(02)-- 配置文件 managed-schema (schema.xml) -- 样例(6)

    managed-schema 样例: <?xml version="1.0" encoding="UTF-8" ?> <!-- License ...

  4. uoj #5. 【NOI2014】动物园

    #5. [NOI2014]动物园 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的园长决定开设算法班,让 ...

  5. tcp/ip四次挥手

    四次分手: 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭.这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接.收到一个 FIN只意味着这一方向上没有数据流动,一个 ...

  6. cmd与bat脚本的使用

    零. bat cmd 命令大全 bat命令大全学习 一..定位到当前路径 1.定位到当前路径 2.方法二 3.win10下面 通解: %windir%\system32\cmd.exe 二 .使用命令 ...

  7. HTTP header parsing errors will be logged at DEBUG level

    -- ::-exec-] INFO org.apache.coyote.http11.Http11Processor - Error parsing HTTP request header Note: ...

  8. vue中点击空白处隐藏弹框(用指令优雅地实现)

    在写vue的项目的时候,弹框经常性出现,并要求点击弹框外面,关闭弹框,那么如何实现呢?且听我一一...不了,能实现效果就好 <template> <div> <div c ...

  9. Proxy opening connection toSpringClound配置豪猪hystrixDashboard发生

    Proxy opening connection to: http://localhost:8001/hystrix.stream 配置hystrixDashboard发生的错误.一直在寻找 最后发现 ...

  10. 剑指Offer——数组中的逆序对(归并排序的应用)

    蛮力: 遍历数组,对每个元素都往前遍历所有元素,如果有发现比它小的元素,就count++. 最后返回count取模. 结果没问题,但超时哈哈哈,只能过50%.   归并法: 看讨论,知道了这道题的经典 ...