BZOJ 2141 排队 (三维偏序CDQ+树状数组)
题目大意:略
和 [CQOI2015]动态逆序对 这道题一样的思路
一开始的序列视为$n$次插入操作
把每次交换操作看成四次操作,删除$x$,删除$y$,加入$x$,加入$y$
把每次操作都看成一个三元组 $<x,w,t>$ 操作位置,权值,以及操作时间
变成了一道三维偏序裸题
外层按操作时间$t$升序,回溯时按操作位置$x$排序
处理左区间对右区间的影响时,正反两次树状数组求逆序对即可
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 30100
#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,ma,nn,K; struct BIT{
int s[N1];
void update(int x,int w){for(int i=x;i<=ma;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;
struct node{int p,x,w,t,ans;}a[N1],tmp[N1];
int c[N1],q[N1],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=M-,j=R-,cnt=,x;
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{
a[j].ans+=b.query(a[j].w-);
j--;
}
}
while(i>=L) {i--;}
while(j>=M) {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{
a[j].ans+=b.query(ma)-b.query(a[j].w);
tmp[++cnt]=a[j]; j++;
}
}
while(i<M) {tmp[++cnt]=a[i]; i++;}
while(j<R) {a[j].ans+=b.query(ma)-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){return s1.t<s2.t;} int main()
{
scanf("%d",&n);
int i,j,x,y; ll ans=;
for(i=;i<=n;i++) c[i]=a[i].w=gint();
sort(c+,c+n+);
ma=unique(c+,c+n+)-(c+);
for(i=;i<=n;i++) a[i].w=lower_bound(c+,c+ma+,a[i].w)-c,q[i]=a[i].w;
for(i=;i<=n;i++) a[i].p=,a[i].t=i,a[i].x=i;
for(i=n;i>=;i--) ans+=b.query(a[i].w-),b.update(a[i].w,);
memset(b.s,,sizeof(b.s));
scanf("%d",&m); nn=n;
for(i=n+;i<=n+m;i++)
{
x=gint(); y=gint();
a[++nn].p=-,a[nn].t=nn,a[nn].x=x,a[nn].w=q[x];//,a[nn].id=i-n;
a[++nn].p=-,a[nn].t=nn,a[nn].x=y,a[nn].w=q[y];//a[nn].id=i-n;
swap(q[x],q[y]);
a[++nn].p=,a[nn].t=nn,a[nn].x=x,a[nn].w=q[x];//a[nn].id=i-n;
a[++nn].p=,a[nn].t=nn,a[nn].x=y,a[nn].w=q[y];//a[nn].id=i-n;
}
CDQ(,nn+);
sort(a+,a+nn+,cmp);
printf("%lld\n",ans);
for(i=n+;i<=nn;i+=)
{
ans+=-a[i].ans-a[i+].ans+a[i+].ans+a[i+].ans;
printf("%lld\n",ans);
}
return ;
}
BZOJ 2141 排队 (三维偏序CDQ+树状数组)的更多相关文章
- BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)
题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等 ...
- BZOJ 2716/2648 SJY摆棋子 (三维偏序CDQ+树状数组)
题目大意: 洛谷传送门 这明明是一道KD-Tree,CDQ分治是TLE的做法 化简式子,$|x1-x2|-|y1-y2|=(x1+y1)-(x2+y2)$ 而$CDQ$分治只能解决$x1 \leq x ...
- BZOJ 1176/2683 Mokia (三维偏序CDQ+树状数组)
题目大意: 洛谷传送门 三维偏序裸题.. 每次操作都看成一个三元组$<x,y,t>$,表示$x,y$坐标和操作时间$t $ 询问操作拆成$4$个容斥 接下来就是$CDQ$了,外层按t排序, ...
- BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)
题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数 ...
- Bzoj 2141: 排队 分块,逆序对,树状数组
2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MBSubmit: 1310 Solved: 517[Submit][Status][Discuss] D ...
- 洛谷P3810-陌上开花(三维偏序, CDQ, 树状数组)
链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay < ...
- bzoj3262陌上花开 三维数点 cdq+树状数组
大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 ...
- Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
随机推荐
- Project Euler 14 Longest Collatz sequence
题意:对于任意一个数 N ,寻找在 100,0000 之内按照规则( N 为奇数 N = N * 3 + 1 ,N 为偶数 N = N / 2 ,直到 N = 1 时的步数 )步数的最大值 思路:记忆 ...
- nyoj27-水池数目【DFS】
题目描述: 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水 ...
- 轻量级Java EE开发框架设计系统应用架构
首先来说一下Java EE 概述 其中常说的三大框架即是:ssh Spring:功能强大的组件粘合济,能够将你的所有的java功能模块用配置文件的方式组合起来(还让你感觉不到spring的存在)成为一 ...
- deep learning 经典网络模型之Alexnet、VGG、Googlenet、Resnet
CNN的发展史 上一篇回顾讲的是2006年Hinton他们的Science Paper,当时提到,2006年虽然Deep Learning的概念被提出来了,但是学术界的大家还是表示不服.当时有流传的段 ...
- HDU 5168
把边按权值排序后,就相当于求一个子序列以1开始和以n结束.由于边权递增,而且相差>=k,所以,边的顺序也必定是递增的.知道,当处理一条出边时,必定是从入边选择一条最优的边,考虑两个因素,入边的权 ...
- Routh-Hurwitz Criterion 劳斯稳定判据
Routh-Hurwitz Criterion 为什么仅仅要有一个极点在右半平面,那么系统就不会稳定? 比如H(s) =( 1/(s+1) ) * ( 1/(s+3) ) * ( 1/(s-2) ) ...
- 两列等高布局 padding+margin的负值 CSS布局奇淫技巧之-多列等高
代码: 效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/ ...
- hdoj 2795 Billboard 【线段树 单点更新 + 维护区间最大值】
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【剑指Offer学习】【面试题26:复杂链表的复制】
题目:请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表. 在复杂链表中,每一个结点除了有一个next 域指向下一个结点外,另一个sib ...
- iOS~判断应用是否有定位权限
在特定场景下我们需要判断用户是否允许应用获取定位权限 1.导入类库: #import <CoreLocation/CLLocationManager.h> 2.判断用户手机是否开启了定位服 ...