BZOJ 2141 排队(分块+树状数组)
题意
第一行为一个正整数n,表示小朋友的数量;第二行包含n个由空格分隔的正整数h1,h2,…,hn,依次表示初始队列中小朋友的身高;第三行为一个正整数m,表示交换操作的次数;以下m行每行包含两个正整数ai和bi,表示交换位置ai与位置bi的小朋友。
输出文件共m行,第i行一个正整数表示交换操作i结束后,序列的杂乱程度(逆序对数)。
1≤m≤2*10^3,1≤n≤2*104,1≤hi≤109,ai≠bi,1≤ai,bi≤n。
题解
难受,PE看成RE,下了数据手测20组发现没有问题,最后发现多了一个endl;
然后有重复但并不用去重。
分块做法
首先离散化,分块,对于每块建立一个树状数组,保存这个块中的所有元素
然后对于每个询问(x,y) (x<y) 两侧的数是没有影响的,区间(x,y)的数a[i]讨论如下:
a[i]<a[x] --ans
a[i]>a[x] ++ans
a[i]<a[y] ++ans
a[i]>a[y] --ans
然后对于块中的树状数组处理,块外的暴力
然后附上分块VSCDQ(上面的是分块)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
int n,a[N],b[N],block[N],Block,size[N],L[N],R[N],m,tr[][N],ans;
int lowbit(int x){
return x&-x;
}
void add(int id,int x,int w){
for(int i=x;i<=n;i+=lowbit(i)){
tr[id][i]+=w;
}
}
int getsum(int id,int x){
int tmp=;
for(int i=x;i;i-=lowbit(i)){
tmp+=tr[id][i];
}
return tmp;
}
int main(){
// freopen("20.in","r",stdin);
// freopen("xdx.out","w",stdout);
scanf("%d",&n);
Block=sqrt(n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
block[i]=(i-)/Block+;
size[block[i]]++;
if(!L[block[i]])L[block[i]]=i;
R[block[i]]=i;
}
sort(b+,b++n);
int tot=unique(b+,b++n)-b-;
for(int i=;i<=n;i++){
a[i]=lower_bound(b+,b++tot,a[i])-b;
}
// cout<<endl;
for(int i=;i<=n;i++){
add(block[i],a[i],);
}
for(int i=n;i>=;i--){
add(,a[i],);
ans+=getsum(,a[i]-);
}
scanf("%d",&m);
printf("%d\n",ans);
for(int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
if(x>y)swap(x,y);
if(block[x]+>=block[y]){
for(int i=x+;i<=y-;i++){
if(a[x]>a[i])ans--;if(a[x]<a[i])ans++;
if(a[y]<a[i])ans--;if(a[y]>a[i])ans++;
}
}
else{
for(int i=block[x]+;i<=block[y]-;i++){
ans-=getsum(i,a[x]-)+size[i]-getsum(i,a[y]);
ans+=getsum(i,a[y]-)+size[i]-getsum(i,a[x]);
}
for(int i=x+;i<=R[block[x]];i++){
if(a[x]>a[i])ans--;if(a[x]<a[i])ans++;
if(a[y]<a[i])ans--;if(a[y]>a[i])ans++;
}
for(int i=L[block[y]];i<=y-;i++){
if(a[x]>a[i])ans--;if(a[x]<a[i])ans++;
if(a[y]<a[i])ans--;if(a[y]>a[i])ans++;
}
}
if(a[x]>a[y])ans--;
if(a[x]<a[y])ans++;
add(block[x],a[x],-);add(block[x],a[y],);
add(block[y],a[y],-);add(block[y],a[x],);
swap(a[x],a[y]);
printf("%d\n",ans);
}
return ;
}
BZOJ 2141 排队(分块+树状数组)的更多相关文章
- BZOJ 2141 排队(树状数组套treap)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2141 题意:给出一个数列A,每次交换两个数的位置.输出交换后逆序对的个数. 思路:首先, ...
- 【bzoj2141】排队 分块+树状数组
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别, ...
- BZOJ2141:排队(分块,树状数组)
Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们 ...
- BZOJ 3333 排队计划 树状数组+线段树
题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...
- BZOJ_2141_排队_树状数组+分块
BZOJ2141_排队_树状数组+分块 Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了 ...
- 【BZOJ 3295】动态逆序对 - 分块+树状数组
题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
- 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu
https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...
- Bzoj 2141: 排队 分块,逆序对,树状数组
2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MBSubmit: 1310 Solved: 517[Submit][Status][Discuss] D ...
随机推荐
- xBIM 基础13 WeXplorer 设置模型颜色
系列目录 [已更新最新开发文章,点击查看详细] 默认情况下模型具有合理的图形表示.这是从IFC模型中获取的,它应该在所有工具中看起来相同,它应该与您或您的用户的创作环境中的相同.但有时候能够改 ...
- 05:Cave Cows 1 洞穴里的牛之一
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 262144kB 描述 很少人知道其实奶牛非常喜欢到洞穴里面去探险. 洞窟里有N(1≤N≤100)个洞室,由 ...
- (转载)RecyclerView之ItemDecoration由浅入深
RecyclerView之ItemDecoration由浅入深 作者 小武站台 关注 2016.09.19 18:20 字数 1155 阅读 10480评论 15喜欢 91赞赏 3 译文的GitHub ...
- EL与JSTL学习(一)EL技术
1.EL 表达式概述 EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写. 2.EL从域中取出数据(EL最重要的作 ...
- shell编程笔记1
参考文章:1 http://blog.csdn.net/wuwenxiang91322/article/details/9259877 通过chmod改变文件权限 补充知识: 1Linux文件的三 ...
- pic16F1938
1.中断自动保存寄存器:W.STATUS.BSR.FSR和PCLATH,而且如果中断中需要改变这些寄存器,在Bank31中修改这些寄存器的影子寄存器即可. 2.RAM有1024字节,分为N个bank, ...
- python编程基础
Date: 2019-05-27 Author: Sun 1. 程序 为了完成某种特定功能,以某种程序设计语言编写的有序指令的集合.程序是指挥cpu工作的"工作手册".计算机只能执 ...
- Hadoop不同模式下关键配置属性
Hadoop分为三种模式: 独立(或本地)模式. 伪分布模式. 全分布模式 不同模式下关键配置项及属性内容如下面表格所示 组件名称 配置的文件名 属性名称 独立模式 伪分布模式 全分布模式 Commo ...
- 路飞学城Python-Day7
Moudle 2 1.鸡汤中国人均阅读4.35本:日本40本:韩国17本:法国20本:以色列60本成长的路上需要读书,坚持读书内心会得到升华的想法不要太多,尽量多读书,多充电多读书,多看报,少吃零食, ...
- [NOIP2003提高组]侦探推理
题目:洛谷P1039.Vijos P1106.codevs1089. 题目大意:给你一系列证词,要你求出谁是凶手.具体题目见原题. 解题思路:我们枚举犯人和星期,一个一个进行判断.如果成功则记录答案, ...