[bzoj2141][排队] (分块大法好)
Description
排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和。红星幼儿园的小朋友们排起了长长地队伍,准备吃果果。不过因为小朋友们的身高有所区别,排成的队伍高低错乱,极不美观。设第i个小朋友的身高为hi,我们定义一个序列的杂乱程度为:满足ihj的(i,j)数量。幼儿园阿姨每次会选出两个小朋友,交换他们的位置,请你帮忙计算出每次交换后,序列的杂乱程度。为方便幼儿园阿姨统计,在未进行任何交换操作时,你也应该输出该序列的杂乱程度。
Input
第一行为一个正整数n,表示小朋友的数量;第二行包含n个由空格分隔的正整数h1,h2,…,hn,依次表示初始队列中小朋友的身高;第三行为一个正整数m,表示交换操作的次数;以下m行每行包含两个正整数ai和bi¬,表示交换位置ai与位置bi的小朋友。
Output
输出文件共m行,第i行一个正整数表示交换操作i结束后,序列的杂乱程度。
Sample Input
Sample Output
【样例说明】
未进行任何操作时,(2,3)满足条件;
操作1结束后,序列为130 140 150,不存在满足ihj的(i,j)对;
操作2结束后,序列为150 140 130,(1,2),(1,3),(2,3)共3对满足条件的(i,j)。
【数据规模和约定】
对于100%的数据,1≤m≤2*103,1≤n≤2*104,1≤hi≤109,ai≠bi,1≤ai,bi≤n。
Solution
分块啊,用块套树状数组,分块处理逆序对
考虑交换,不完整块就暴力枚举更新完整的就用树状数组直接更新
//Kaiba_Seto 20170116
//otz cjkmao
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MaxN 20010
#define MaxBuf 1<<22
#define RG register
#define inline __inline__ __attribute__((always_inline))
#define Blue() (((S == T)&&(T=(S=B)+fread(B,1,MaxBuf,stdin),S == T)) ? 0 : *S++) char B[MaxBuf],*S=B,*T=B; inline void Rin(RG int &x) {
x=;RG int c=Blue(),f=;
for(; c<||c>; c=Blue())
if(c==)f=-;
for(; c>&&c<; c=Blue())
x=(x<<)+(x<<)+c-;
x*=f; } struct Pr{
int fir,sec;
bool operator < (const Pr &other) const {
return fir < other.fir; } }b[MaxN]; int n,m,a[MaxN],block_size,c1[MaxN],c2[][MaxN],ans; inline void exc(RG int &x,RG int &y) {
x^=y;
y^=x;
x^=y; } inline void modify(RG int *C,RG int x,RG int d) {
for(; x<=n; x+=x&(-x))
C[x]+=d; } inline int sum(RG int *C,RG int x) {
RG int res=;
for(; x; x-=x&(-x))
res+=C[x];
return res; } int main() {
Rin(n);
block_size=static_cast<int>(sqrt(n)+1e-);
for(RG int i=; i<=n; i++)
Rin(b[i].fir),b[i].sec=i;
std::sort(b+,b++n);
for(RG int i=; i<=n; i++) {
static int top=;
if(b[i].fir != b[i-].fir)
++top;
a[b[i].sec]=top; }
for(RG int i=n; i; i--)
ans+=sum(c1,a[i]-),modify(c1,a[i],);
for(RG int i=; i<=n; i++)
modify(c2[(i-)/block_size],a[i],);
printf("%d\n",ans);
Rin(m);
while(m--) {
RG int x,y,l,r,i;
Rin(x),Rin(y);
if(x > y)exc(x,y);
l=(x-)/block_size+;
r=(y-)/block_size-;
if(l <= r) {
for(i=l; i<=r; i++)
ans=ans-sum(c2[i],a[x]-)+sum(c2[i],n)-sum(c2[i],a[x])+sum(c2[i],a[y]-)-sum(c2[i],n)+sum(c2[i],a[y]);
for(i=x+; i<=l*block_size; i++) {
if(a[i] < a[x])ans--;
if(a[i] > a[x])ans++;
if(a[i] > a[y])ans--;
if(a[i] < a[y])ans++; }
for(i=(r+)*block_size+; i<y; i++) {
if(a[i] < a[x])ans--;
if(a[i] > a[x])ans++;
if(a[i] > a[y])ans--;
if(a[i] < a[y])ans++; }
}
else {
for(i=x+; i<y; i++) {
if(a[i] < a[x])ans--;
if(a[i] > a[x])ans++;
if(a[i] > a[y])ans--;
if(a[i] < a[y])ans++; } }
if(a[x] < a[y])ans++;
else if(a[x] > a[y])ans--;
printf("%d\n",ans);
modify(c2[(x-)/block_size],a[x],-);
modify(c2[(x-)/block_size],a[y],);
modify(c2[(y-)/block_size],a[x],);
modify(c2[(y-)/block_size],a[y],-);
exc(a[x],a[y]); }
fclose(stdin);
return ; }
orz cjkmao/Mr.cjk.cat
[bzoj2141][排队] (分块大法好)的更多相关文章
- BZOJ2141:排队(分块,树状数组)
Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们 ...
- 【bzoj2141】排队 分块+树状数组
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别, ...
- BZOJ2141 排队 树状数组 分块
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2141.html 题目传送门 - BZOJ2141 题意 给定一个序列 $a$ ,先输出原先的逆序对数. ...
- 【分块】【树套树】bzoj2141 排队
考虑暴力更新的情况,设swap的是L,R位置的数.swap之后的逆序对数应该等于:之前的逆序对数+[L+1,R-1]中比 L位置的数 大的数的个数-[L+1,R-1]中比 L位置的数 小的数的个数-[ ...
- bzoj2141: 排队(分块+树状数组)
块套树为什么会这么快.. 先跑出原序列逆序对. 显然交换两个位置$l,r$,对$[1,l),(r,n]$里的数没有影响,所以只需要考虑$[l,r]$内的数. 设$(l,r)$内的数$a_i$,则按以下 ...
- Bzoj 2141: 排队 分块,逆序对,树状数组
2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MBSubmit: 1310 Solved: 517[Submit][Status][Discuss] D ...
- bzoj 2141 : 排队 分块
题目链接 2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MBSubmit: 1169 Solved: 465[Submit][Status][Discu ...
- bzoj 1699: [Usaco2007 Jan]Balanced Lineup排队 分块
1699: [Usaco2007 Jan]Balanced Lineup排队 Time Limit: 5 Sec Memory Limit: 64 MB Description 每天,农夫 John ...
- bzoj2141排队(辣鸡但是好写的方法)
题意很明确,也非常经典: 一个支持查询 区间中比k大的数的个数 并且支持单点修改的序列 ——因为题意可以转化为:查询这两个数中比后者大的个数.比后者小的个数.比前者大的个数.比前者小的个数(根据这4个 ...
随机推荐
- sql2000数据库置疑造成的原因以及如何解决置疑
造成数据库置疑一般有以下几点: 1)电脑非法关机或者意外停电: 2)磁盘有坏道或者损坏: 3)数据库感染病毒,日志文件损坏: 4)非正常情况下移动数据库文件 5)系统,硬盘,经常强制性关机(如断电)类 ...
- Flask-SQLAlchemy - 不使用外键连表查询。记得常回来看我
前言 相比于 Django 的 ORM ,SQLAlchemy "不依靠外键进行跨表联查" 的解决方案就比较多. 没啥好说的,只能怪自己学艺不精.. _(:з」∠)_ 解决办法 ...
- bzoj 4198: [Noi2015]荷马史诗【哈夫曼树+贪心】
和合并果子类似(但是是第一次听说哈夫曼树这种东西) 做法也类似,就是因为不用知道树的形态,所以贪心的把最小的k个点合为一个节点,然后依次向上累加即可,具体做法同合并果子(但是使用优先队列 注意这里可能 ...
- VBNET AutoCAD Activex 切换图层为当前图层失效
最近有朋友询问切换图层的代码 com切换图层 <CommandMethod("mycl")> Public Sub MySubLayerChange() Dim Thi ...
- serlvet HttpServletRequest
1.http://localhost/az/servlet/TestResponse out.print("getServletPath:"+request.getServletP ...
- 最短路 Codeforces Round #103 (Div. 2) D. Missile Silos
题目传送门 /* 最短路: 不仅扫描边,还要扫描点:点有两种情况,一种刚好在中点,即从u,v都一样,那么最后/2 还有一种是从u,v不一样,两种的距离都是l 模板错了,逗了好久:( */ #inclu ...
- E - A^B mod C (大数乘方取模)
Description Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,B,C<2^63) ...
- ACM_输出格式
输出格式 Time Limit: 2000/1000ms (Java/Others) Problem Description: 某水比参加了XX杯,但是他太水,所以三等都木有,所以他决定出一道水题水一 ...
- IIS网站部署步骤以及常见异常解决方案
一. 简述 如果VS调试代码每次都使用浏览器打开,修改脚本和样式等还可以刷新页面显示最新修改,但是修改后台代码的话就需要停止调试再重新使用浏览器打开才能显示后台的最新修改,就比较麻烦.这里推荐附加到I ...
- MySql学习笔记(1)-安装
一.安装环境 操作系统:win7 64ibt MySql版本:5.7.10.0 二.安装过程 1.点击Add 2.选择需要安装的组件 3.Excute 4.Next 5.Next 6.进入服务器配置 ...