BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)
题目大意:
还是一道三维偏序题
每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间
一开始的序列看成n次插入操作
我们先求出不删除时的逆序对总数量,再统计每次删除元素时,减少的逆序对数量
然后就是三维偏序裸题了吧,第一维时间,第二维操作位置,第三维权值,用树状数组维护即可
由于逆序对可以在被删除元素的前面或者后面,所以在归并时需要正反遍历各统计一次
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 150100
#define ll long long
#define dd double
#define inf 0x3f3f3f3f3f3f3f3fll
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m,nn,K; struct node{
int p,t,x,w,ans;
}a[N1],tmp[N1]; struct BIT{
int s[N1];
void update(int x,int w){for(int i=x;i<=n;i+=(i&(-i))) s[i]+=w;}
int query(int x){int ans=; for(int i=x;i;i-=(i&(-i))) ans+=s[i]; return ans;}
}b; int que[N1],tl;
void CDQ(int L,int R)
{
if(R-L<=) return;
int M=(L+R)>>;
CDQ(L,M); CDQ(M,R);
int i,j,x,cnt; i=M-,j=R-,cnt=;
while(i>=L&&j>=M)
{
if(a[i].x>a[j].x){
b.update(a[i].w,a[i].p);
que[++tl]=i; i--;
}else{
if(a[j].p==-) a[j].ans+=b.query(a[j].w-);
j--;
}
}
while(i>=L) {i--;}
while(j>=M) {if(a[j].p==-) a[j].ans+=b.query(a[j].w-); j--;}
while(tl) {x=que[tl--]; b.update(a[x].w,-a[x].p);} i=L,j=M,cnt=;
while(i<M&&j<R)
{
if(a[i].x<a[j].x){
b.update(a[i].w,a[i].p);
que[++tl]=i; tmp[++cnt]=a[i]; i++;
}else{
if(a[j].p==-) a[j].ans+=b.query(n)-b.query(a[j].w);
tmp[++cnt]=a[j]; j++;
}
}
while(i<M) {tmp[++cnt]=a[i]; i++;}
while(j<R) {if(a[j].p==-) a[j].ans+=b.query(n)-b.query(a[j].w); tmp[++cnt]=a[j]; j++;}
while(tl) {x=que[tl--]; b.update(a[x].w,-a[x].p);} for(i=L;i<R;i++) a[i]=tmp[i-L+];
}
int cmp(node s1,node s2){
if(s1.p!=s2.p) return s1.p>s2.p;
return s1.t<s2.t;}
int pos[N1]; int main()
{
scanf("%d%d",&n,&m);
int i; ll ans=; nn=n+m;
for(i=;i<=n;i++) a[i].w=gint(),a[i].x=i,a[i].p=,a[i].t=i,pos[a[i].w]=i;
for(i=n;i>=;i--) ans+=b.query(a[i].w),b.update(a[i].w,);
memset(b.s,,sizeof(b.s));
for(i=n+;i<=n+m;i++) a[i].w=gint(),a[i].x=pos[a[i].w],a[i].p=-,a[i].t=i;
CDQ(,n+m+);
sort(a+,a+n+m+,cmp);
for(i=n+;i<=n+m;i++)
{
printf("%lld\n",ans);
ans-=a[i].ans;
}
return ;
}
BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)的更多相关文章
- BZOJ 2716/2648 SJY摆棋子 (三维偏序CDQ+树状数组)
题目大意: 洛谷传送门 这明明是一道KD-Tree,CDQ分治是TLE的做法 化简式子,$|x1-x2|-|y1-y2|=(x1+y1)-(x2+y2)$ 而$CDQ$分治只能解决$x1 \leq x ...
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]
RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...
- 【刷题】BZOJ 3295 [Cqoi2011]动态逆序对
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- BZOJ 2141 排队 (三维偏序CDQ+树状数组)
题目大意:略 洛谷传送门 和 [CQOI2015]动态逆序对 这道题一样的思路 一开始的序列视为$n$次插入操作 把每次交换操作看成四次操作,删除$x$,删除$y$,加入$x$,加入$y$ 把每次操作 ...
- BZOJ 1176/2683 Mokia (三维偏序CDQ+树状数组)
题目大意: 洛谷传送门 三维偏序裸题.. 每次操作都看成一个三元组$<x,y,t>$,表示$x,y$坐标和操作时间$t $ 询问操作拆成$4$个容斥 接下来就是$CDQ$了,外层按t排序, ...
- BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)
题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等 ...
- 洛谷P3810-陌上开花(三维偏序, CDQ, 树状数组)
链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay < ...
随机推荐
- 用基于WebGL的BabylonJS来共享你的3D扫描模型
转自:http://www.geekfan.net/6578/ 用基于WebGL的BabylonJS来共享你的3D扫描模型 杰克祥子 2014 年 2 月 26 日 0 条评论 标签:3D扫描 , B ...
- 计蒜客 阿里天池的新任务—简单( KMP水 )
链接:传送门 思路:KMP模板题,直接生成 S 串,然后匹配一下 P 串在 S 串出现的次数,注意处理嵌套的情况即可,嵌套的情况即 S = "aaaaaa" ,P = " ...
- CentOS 笔记(五) 常用工具
远程 :XShell6 ,PuTTy FPT:Xfpt ,pscp.exe
- AMPL下载使用
AMPL下载使用 依次执行以下操作 wget https://ampl.com/demo/amplide.linux64.tgz tar xzf amplide.linux64.tgz cd ampl ...
- 获取某个参数的值 value
Window("Flight Reservation").WinEdit("Order No:").Output CheckPoint("Order ...
- BA-siemens-apogee-ppcl
adapts函数的使用 常规控制风机及阀门的程序是使用PID来调节,但是自适应算法能更好的调节. 西门子的自适应调节函数adapts用法如下: 以下文章为网络转载,原文链接地址http://news. ...
- Linux线程资源限制
- Hadoop Word Count程序
Hadoop Word Count程序 pom.xml文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns ...
- poi判断一行是隐藏的getZeroHeight()
poi判断一行是隐藏的 getZeroHeight() boolean isZeroHeight = row.getZeroHeight(); if(isZeroHeight){ // 如果为隐藏行就 ...
- 韩国IT业是怎么走向国际我们须要学习什么
无论从国土面积仍是从人口数量上来衡量.韩国都不能算是一个大国,而且自然资本十分缺乏,即是在这种情况下,韩国经过几十年的尽力开展变成技能大国,格外是在IT这种新经济范畴更是引人注目.并诞生了三星等国际级 ...