[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个 ...
随机推荐
- gitlab gerrit jenkins CI/CD环境集成
http://blog.csdn.net/williamwanglei/article/details/38498465
- JVM系列-类加载机制
简介 在java中,类的声明周期总共分为以下几种: 加载(Loading),验证(Verification),准备(Preparation),解析(Analysis), 初始化(Initializat ...
- SVN请求认证信息
WIN10:C:\Users\Home目录\AppData\Roaming\Subversion Window Server 系统:C:\Users\Home目录\AppData\Roaming\Su ...
- bootstrap的modal弹窗,在多层窗口关闭时只会关闭自窗口,不再关闭父窗口
bootstrap多层modal弹窗时.当子窗口关闭时,所有父窗口一起关闭. 原因是bootstrap在窗口关闭事件委托时,委托给所有窗口. 如源码: this.$element.on('click. ...
- 题解报告:hdu 1686 Oulipo(裸KMP)
Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, w ...
- 283 Move Zeroes 移动零
给定一个数组 nums, 编写一个函数将所有 0 移动到它的末尾,同时保持非零元素的相对顺序.例如, 定义 nums = [0, 1, 0, 3, 12],调用函数之后, nums 应为 [1, 3, ...
- protobuf的lua版
推荐个protobuf的lua版 以前项目客户端lua,通信协议是protobuf,用网易的proto-gen-lua,使用过程遇到些问题需要绕,比如: 1.每次更改.增加proto都要生成新 ...
- Meta标签 h5
一 PC端meta标签 1 页面关键词 <meta name="keywords" content="your tags"> 2 页面描述 < ...
- 【转载】 python sort、sorted高级排序技巧
这篇文章主要介绍了python sort.sorted高级排序技巧,本文讲解了基础排序.升序和降序.排序的稳定性和复杂排序.cmp函数排序法等内容,需要的朋友可以参考下 Python list内置so ...
- Bootstrap Datatable 简单的基本配置
$(document).ready(function() { $('#example').dataTable({ "sScrollX": "100%", ...