[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个 ...
随机推荐
- Python基础第六天
一.内容 二.练习 练习1 题目:文件的增删改查 图示: 代码: import os def add(data): content = data[1] # 文件内容 file_name = data[ ...
- 杂项-Java:MyBatis
ylbtech-杂项-Java:MyBatis 1.返回顶部 1. MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundatio ...
- .NET 导入导出Excel
第一种方式:OleDb 需要安装office,且读数据慢,而且有数据格式的Cell读出数据不正确等问题.放弃. 第二种方式:NPOI开源库 使用NPOI导入导出Excel应该是.NET开发很常用的手段 ...
- gitlab smtp设置
QQ exmail gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.exmail.qq.com ...
- urllib2.urlopen超时未设置导致程序卡死
没有设置timeout参数,结果在网络环境不好的情况下,时常出现read()方法没有任何反应的问题,程序卡死在read()方法里,搞了大半天,才找到问题,给urlopen加上timeout就ok了,设 ...
- Unity ScriptObject
http://godstamps.blogspot.com/2012/02/unity-3d-scriptableobject-assetbundle.html http://ivanozanchet ...
- [App Store Connect帮助]四、添加 App 图标、App 预览和屏幕快照(6)设置 App 预览海报帧
App 预览海报帧仅在 App 状态为可编辑时,才能被编辑. 必要职能:“帐户持有人”职能.“管理”职能.“App 管理”职能或“营销”职能.请参见职能权限. 在首页上,点按“我的 App”,选择您的 ...
- [Qt Creator 快速入门] 第9章 国际化、帮助系统和Qt插件
一.国际化 国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),一个应用程序的国际化就是使该应用程序可以让其他国家的用户使用的过程. Qt支持现在 ...
- [Qt Creator 快速入门] 第2章 Qt程序编译和源码详解
一.编写 Hello World Gui程序 Hello World程序就是让应用程序显示"Hello World"字符串.这是最简单的应用,但却包含了一个应用程序的基本要素,所以 ...
- CF482C Game with Strings
题意 你和你的朋友玩一个游戏,游戏规则如下. 你的朋友创造 n 个长度均为 m 的不相同的字符串,然后他随机地选择其中一个.他选择这些字符串的概率是相等的,也就是说,他选择 n 个字符串中的每一个的概 ...