[题解]bzoj3295 CQOI2011动态逆序对
来源:互联网 发布:淘宝买家秀招聘 编辑:程序博客网 时间:2024/06/05 17:10
Description
对于序列A,它的逆序对数定义为满足i
Input
输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数。以下n行每行包含一个1到n之间的正整数,即初始排列。以下m行每行一个正整数,依次为每次删除的元素。
Output
输出包含m行,依次为删除每个元素之前,逆序对的个数。
Sample Input
5 4
1
5
3
4
2
5
1
4
2
Sample Output
5
2
2
1
Solution
先处理出整个序列的逆序对,然后对于每个要删除的数,查询它前面有多少个比他大的,后面有多少个比他小的,这就是由这个数构成的逆序对数量,用总逆序对减去就好了。这个用带修改主席树维护。
代码:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;template<typename T>inline void read(T &x){ T f=1;char ch=getchar(); for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(x=0;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0'; x*=f;}typedef long long LL;const int maxn=100010;struct node{ int lc,rc,size; node():lc(0),rc(0),size(0){}}T[maxn*100];int n,m,c[maxn],pos[maxn],root[maxn],cnt;LL ans;void Insert(int &x,int l,int r,int val,int t){ if(!x)x=++cnt;T[x].size+=t; if(l==r)return; int mid=(l+r)>>1; if(val<=mid)Insert(T[x].lc,l,mid,val,t); else Insert(T[x].rc,mid+1,r,val,t);}int Qmin(int x,int l,int r,int val){ if(r<=val)return T[x].size; int mid=(l+r)>>1; if(val<=mid)return Qmin(T[x].lc,l,mid,val); else return T[T[x].lc].size+Qmin(T[x].rc,mid+1,r,val);}int Qmax(int x,int l,int r,int val){ if(l>=val)return T[x].size; int mid=(l+r)>>1; if(val<=mid)return Qmax(T[x].lc,l,mid,val)+T[T[x].rc].size; else return Qmax(T[x].rc,mid+1,r,val);}void Add(int x,int val,int t){ while(x<=n){ Insert(root[x],1,n,val,t); x+=(x&-x); }}LL Query(int x,int val,bool f){ LL res=0; while(x){ if(f)res+=Qmax(root[x],1,n,val); else res+=Qmin(root[x],1,n,val); x-=(x&-x); } return res;}int main(){ read(n);read(m); for(int i=1,x;i<=n;i++){ read(x);Add(pos[x]=i,x,1); for(int j=n;j;j-=(j&-j))ans+=c[j]; for(int j=x;j;j-=(j&-j))ans-=c[j]; for(int j=x;j<=n;j+=(j&-j))c[j]++; } for(int i=1,x;i<=m;i++){ printf("%lld\n",ans);read(x); ans-=Query(pos[x]-1,x,1); ans-=Query(n,x,0)-Query(pos[x],x,0); Add(pos[x],x,-1); } return 0;}
阅读全文
0 0
- bzoj3295: [Cqoi2011]动态逆序对(题解2)
- [题解]bzoj3295 CQOI2011动态逆序对
- 【CQOI2011】【BZOJ3295】动态逆序对
- BZOJ3295 CQOI2011 动态逆序对
- [BZOJ3295] [Cqoi2011]动态逆序对
- 【bzoj3295】[Cqoi2011]动态逆序对
- bzoj3295: [Cqoi2011]动态逆序对
- bzoj3295【CQOI2011】动态逆序对
- 【Cqoi2011】【BZOJ3295】动态逆序对
- bzoj3295: [Cqoi2011]动态逆序对
- [BZOJ3295][Cqoi2011]动态逆序对
- bzoj3295[Cqoi2011] 动态逆序对
- bzoj3295 [Cqoi2011]动态逆序对
- BZOJ3295: [Cqoi2011]动态逆序对
- bzoj3295: [Cqoi2011]动态逆序对
- 【bzoj3295】[Cqoi2011]动态逆序对
- BZOJ3295: [Cqoi2011]动态逆序对
- 【BZOJ3295】【Cqoi2011】动态逆序对
- 事务的四个特点
- android 判断是否是第三方应用
- Docker入门
- nyoj--116--士兵杀敌(二)
- newifi mini升级极路由固件
- [题解]bzoj3295 CQOI2011动态逆序对
- java日期,时间戳相关应用
- java实现冒泡排序算法程序
- 记一次Centos6.7ssh免密钥登陆错误
- ffmpeg开发之旅(1):视频直播YUV颜色格式完全解析
- XZ_iOS之RAC(ReactiveCocoa)的介绍和使用
- 共享变量
- 安装SQLSERVER 2012 80端口被占用的问题
- java选择排序算法实现