这题说的是给了一个数组,按照他给的顺序依次删除数,在删除之前输出此时的逆序对个数

我们用Fenwick树 维护这整个数列, C[i]是一个 treap的头, 管理了在树状数组中 能影响他的点,然后我们用名次树去计算 在C[i]下小于等于要删除的那个数的个数就ok了。

#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
#include <cstdio>
#include <stdlib.h>
using namespace std;
const int maxn=;
struct Node
{
Node *ch[];
int r;
int s;
int v;
int vloc;
int cmp(int x)const
{
if(x==v)return -;
return x<v?:;
}
void maintain()
{
s=ch[]->s+ch[]->s+vloc;
}
};
Node *null=new Node();
void rotate(Node *&o, int d)
{
Node *k=o->ch[d^];o->ch[d^]=k->ch[d];k->ch[d]=o;
o->maintain();k->maintain(); o=k;
}
void insert(Node *&o,int x)
{
if(o==null){
o=new Node();
o->ch[]=o->ch[]=null; o->v=x; o->r=rand();o->vloc=;o->s=;
}else{
int d=o->cmp(x);
if(d==-){
o->vloc+=;
}else{
insert(o->ch[d],x);if( o->ch[d]->r > o->r) rotate(o,d^);
}
}
o->maintain();
}
void remove(Node *&o, int x)
{
int d=o->cmp(x);
if(d==-){
if(o->vloc > ){
o->vloc-=;
}else if(o->ch[]==null)o=o->ch[];
else if(o->ch[]==null) o=o->ch[];
else{
int d2 = o->ch[]->r > o->ch[]->r ? : ;
rotate(o,d2); remove(o->ch[d2],x);
}
}else remove(o->ch[d],x);
if(o!=null)
o->maintain();
}
int find(Node *o,int x)
{
int num=;
while(o!=null)
{
int d=o->cmp(x);
if(d==-){
num += o->ch[]->s + o->vloc ;
break;
}else if(d==){
num+=o->ch[]->s+o->vloc;
o=o->ch[];
}else{
o=o->ch[];
}
}
return num;
}
Node *C[maxn];
int cc[maxn],A[maxn];
int lowbit(int x)
{
return (-x)&x;
}
void init(int n)
{
for(int i=; i<=n; i++)
C[i]=null,cc[i]=;
}
int N,M;
void add1(int x, int v)
{
while(x<=N){
cc[x]+=v;
x+=lowbit(x);
}
}
int sum1(int x){
int ans=;
while(x>){
ans+=cc[x];
x-=lowbit(x);
}
return ans;
}
void delet(int x,int v)
{
while(x<=N)
{
remove(C[x],v);
x+=lowbit(x);
}
}
int summ(int x,int v)
{
int ans=;
while(x>)
{
ans+=find(C[x],v);
x-=lowbit(x);
}
return ans;
}
int main()
{
null->s=; while(scanf("%d%d",&N,&M)==)
{
init(N);
long long ans=;
for(int i=; i<=N; i++)
{
int d;
scanf("%d",&d);
A[d]=i;
ans+=sum1(N)-sum1(d);
add1(d,);
int loc=i;
while(loc<=N)
{
insert(C[loc],d); loc+=lowbit(loc);
}
}
for(int i=; i<=M; i++)
{
int d;
printf("%lld\n",ans);
scanf("%d",&d);
int s1xiaoyu=summ(A[d],d);
int ss1=sum1(A[d]);
ans-=(ss1-s1xiaoyu);
int s2xiaoyu=summ(N,d);
ans-=s2xiaoyu-s1xiaoyu;
add1(A[d],-);
delet(A[d],d);
}
}
return ;
}
/*
5 4
1
5
3
4
2
5
1
4
2
*/

uva11990 动态逆序对的更多相关文章

  1. BZOJ 3295: [Cqoi2011]动态逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3865  Solved: 1298[Submit][Sta ...

  2. Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2886  Solved: 924[Submit][Stat ...

  3. 【Luogu1393】动态逆序对(CDQ分治)

    [Luogu1393]动态逆序对(CDQ分治) 题面 题目描述 对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i < j的有序对(i,j)的个数.你需要计算出一个序 ...

  4. 【BZOJ3295】动态逆序对(线段树,树状数组)

    [BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...

  5. bzoj3295[Cqoi2011]动态逆序对 树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5987  Solved: 2080[Submit][Sta ...

  6. cdq分治(hdu 5618 Jam's problem again[陌上花开]、CQOI 2011 动态逆序对、hdu 4742 Pinball Game、hdu 4456 Crowd、[HEOI2016/TJOI2016]序列、[NOI2007]货币兑换 )

    hdu 5618 Jam's problem again #include <bits/stdc++.h> #define MAXN 100010 using namespace std; ...

  7. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  8. P3157 [CQOI2011]动态逆序对

    P3157 [CQOI2011]动态逆序对 https://www.luogu.org/problemnew/show/P3157 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai&g ...

  9. 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)

    3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...

随机推荐

  1. 动态补丁构建工具nuwa中的“坑”

    1. 继承android中的Application的类A1Application:并且A2Application继承自A1Application,并且配置在清单文件中name=".A2App ...

  2. python摸爬滚打之day11----函数闭包,迭代器

    1.函数名 函数名就是一个变量名, 函数名存储的是该函数的内存地址.    函数名都可以进行哪些应用? 函数名可以赋值给其他的变量; 函数名可以作容器里的元素使用; 函数名可以当做形参传进另一函数; ...

  3. shell脚本中sqlite3命令查询数据库失败返回空,并将错误信息打印到标准错误输出

    shell脚本中sqlite3命令查询数据库失败返回空,并将错误信息打印到标准错误输出 如: #/bin/sh local ret='sqlite3 test.db "select test ...

  4. python3安装ipython 过程以及问题

    由于需要再python3的环境下运行demo,因此安装了python3的ipython notebook,过程如下: sudo pip3 install ipython[all]这样就安装了pytho ...

  5. (3.16)mysql基础深入——mysql字符集

    (3.16)mysql基础深入——mysql字符集 关键字:mysql字符集,mysql编码 目录 1.概念 2.常用的字符编码 3.查看mysql字符集 [3.1]查看服务器支持的字符集 [3.2] ...

  6. IIS下实现帝国CMS搜索页伪静态

    前面ytkah讲了apache下帝国CMS搜索页伪静态实现方法,网友说服务器是用IIS,那么IIS下如何实现帝国CMS搜索页伪静态呢?首先得先有URL重写插件,下载地址:http://www.iis. ...

  7. mysql 5.7.12 新增 X plugin x 协议 详解

    mysql 5.7.12 新增 X plugin  x 协议 详解http://xiaozhong991.blog.51cto.com/2354914/1763792 x 协议  操作nosql数据库 ...

  8. 003-RFC关于媒体类型说明

    一.概述 RFC-822   Standard for ARPA Internet text messages [ARPA互连网文本信息标准]RFC-2045 MIME Part 1: Format ...

  9. mongodb studio 3t 破解无限使用脚本

    @echo off ECHO 重置Studio 3T的使用日期...... FOR /f "tokens=1,2,* " %%i IN ('reg query "HKEY ...

  10. C 逗號表達式 與返回值

    逗號表達式的返回值是最後一個表達式的值 int z; z=(,); printf("%d\n",z);//6 int a; printf(*,a*,a+));//20 a=3*5, ...