题目大意:给定一个序列。每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数

首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不变 所以这些数的逆序对不会变化

对于这个位置后面比这个数大的数 因为改变位置的数都比这些数小 所以这些数的逆序对不会变化

说究竟就是排序的数的逆序对数改变了 以这些数開始的逆序对没有了

于是就好办了 我们用树状数组统计出以每一个数開始的逆序对数 然后以原数的大小为keyword建立线段树 维护区间最小值

对于每一个询问p,我们取出[p,n]中的最小值a[x]。将a[x]清为正无穷。把以a[x]开头的逆序对减掉,继续找,直到a[p]为正无穷为止

每一个数仅仅会被找到1次 所以均摊复杂度O(nlogn)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 500500
#define ls tree[p].lson
#define rs tree[p].rson
using namespace std;
struct abcd{
int lson,rson;
int *num;
}tree[M<<1];int tree_tot;
int n,m,tot,a[M];
pair<int,int>b[M];
int c[M],f[M];
long long ans;
int* _min(int *x,int *y)
{
return *x>=*y?y:x;
}
void Build_Tree(int p,int x,int y)
{
int mid=x+y>>1;
if(x==y)
{
tree[p].num=a+mid;
return ;
}
ls=++tree_tot;rs=++tree_tot;
Build_Tree(ls,x,mid);
Build_Tree(rs,mid+1,y);
tree[p].num=_min(tree[ls].num,tree[rs].num);
}
int* Get_Ans(int p,int x,int y,int l,int r)
{
int mid=x+y>>1;
if(x==l&&y==r)
return tree[p].num;
if(r<=mid)
return Get_Ans(ls,x,mid,l,r);
if(l>mid)
return Get_Ans(rs,mid+1,y,l,r);
return _min( Get_Ans(ls,x,mid,l,mid) , Get_Ans(rs,mid+1,y,mid+1,r) );
}
inline void Modify(int p,int x,int y,int pos)
{
int mid=x+y>>1;
if(x==y)
return ;
if(pos<=mid)
Modify(ls,x,mid,pos);
else
Modify(rs,mid+1,y,pos);
tree[p].num=_min(tree[ls].num,tree[rs].num);
}
inline void Update(int x)
{
for(;x<=tot;x+=x&-x)
c[x]++;
}
inline int Get_Ans(int x)
{
int re=0;
for(;x;x-=x&-x)
re+=c[x];
return re;
}
int main()
{
int i,p;
cin>>n>>m;
for(i=1;i<=n;i++)
scanf("%d",&b[i].first),b[i].second=i;
sort(b+1,b+n+1);
for(i=1;i<=n;i++)
{
if(i==1||b[i].first!=b[i-1].first)
++tot;
a[b[i].second]=tot;
}
for(i=n;i;i--)
Update(a[i]),ans+=f[i]=Get_Ans(a[i]-1);
Build_Tree(0,1,n);
printf("%lld\n",ans);
for(i=1;i<=m;i++)
{
int *temp;
scanf("%d",&p);
if(a[p]!=0x3f3f3f3f)
do{
temp=Get_Ans(0,1,n,p,n);
ans-=f[temp-a];
*temp=0x3f3f3f3f;
Modify(0,1,n,temp-a);
}while(temp!=a+p);
printf("%lld\n",ans);
}
}

BZOJ 3333 排队计划 树状数组+线段树的更多相关文章

  1. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  2. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  3. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. 【BZOJ3333】排队计划 树状数组+线段树

    [BZOJ3333]排队计划 Description Input Output Sample Input 6 2 160 163 164 161 167 160 2 3 Sample Output 6 ...

  7. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  8. 【洛谷4396/BZOJ3236】[AHOI2013]作业(莫队+分块/树状数组/线段树)

    题目: 洛谷4396 BZOJ3236(权限) 这题似乎BZOJ上数据强一些? 分析: 这题真的是--一言难尽 发现题面里没说权值的范围,怕出锅就写了离散化.后来经过面向数据编程(以及膜神犇代码)知道 ...

  9. 数据结构--树状数组&&线段树--基本操作

    随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...

随机推荐

  1. Android中使用WebView与JS交互全解析

    1.概述首先,需要提出一个概念,那就是hybrid,主要意思就是native原生Android和h5混合开发.为什么要这样做呢?大家可以想象一下针对于同一个活动,如果使用纯native的开发方式,An ...

  2. execute、executeUpdate、executeQuery三者的区别及返回值

    一.boolean execute(String sql)允许执行查询语句.更新语句.DDL语句.返回值为true时,表示执行的是查询语句,可以通过getResultSet方法获取结果:返回值为fal ...

  3. windows下使用cxfreeze打包python3程序

    1:下载适合版本的cxfreeze http://sourceforge.net/projects/cx-freeze/files/4.3.2/ 2:安装,注意python版本是否正确 3:安装完成后 ...

  4. 关于一个简单面试题(。net)

    猫大叫一声,主人被惊醒,所有的小老鼠开始逃窜. 期初想到的是事件调用方法. 在猫叫的事件中调用一对方法就可以了. 但是,当事件很多的时候 难保大家写着写着就忘记了. 总不能有 10000个人的时候调用 ...

  5. HDFS 搭建记录

    1. 三台服务: 172.17.0.62(namenode) 172.17.0.68(datanode) 172.17.0.76(datanode) /etc/hosts包含的内容: 三台都包含的域名 ...

  6. tomcat发布静态网页

  7. 通过javascript实现1~100内能同时被2和3整除的数并生成如下表格

    请通过javascript实现1~100内能同时被2和3整除的数并生成如下表格: <!DOCTYPE html><html lang="en"><he ...

  8. python关键字

    python有多少关键字? >>> import keyword >>> keyword.kwlist ['and', 'as', 'assert', 'break ...

  9. noip2014 考试总结

    noip:最初估分580,明间数据:570,初测估分:510-570,最终得分:570 这次noip怎么说呢,发挥的还是比较理想吧,不过还是犯了一些“低级错误”,虽然没有造成十分严重的后果,但是还是不 ...

  10. document.body.clientWidth vs document.documentElement.clientWidth

    http://blog.csdn.net/zb0567/article/details/7182391 mobile web javascript library http://www.gbin1.c ...