bzoj2141: 排队(分块+树状数组)
块套树为什么会这么快。。
先跑出原序列逆序对。
显然交换两个位置$l,r$,对$[1,l),(r,n]$里的数没有影响,所以只需要考虑$[l,r]$内的数。
设$(l,r)$内的数$a_i$,则按以下规则更新答案:
若$a_i<a_l$,则$ans--$
若$a_i>a_l$,则$ans++$
若$a_i<a_r$,则$ans++$
若$a_i>a_r$,则$ans--$
若$a_l<a_r$,则$ans++$
若$a_l>a_r$,则$ans--$
对每一个块建一个树状数组,查询的时候块内用树状数组查,块外暴力就好了。。。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=;
int n, m, blo, N, ans, l, r, L, R;
int tree[][maxn], bl[maxn], a[maxn], b[maxn], pretree[maxn];
inline void read(int &k)
{
int f=; k=; char c=getchar();
while(c<'' || c>'') c=='-' && (f=-), c=getchar();
while(c<='' && c>='') k=k*+c-'', c=getchar();
k*=f;
}
inline void update(int ty, int x, int delta){for(;x<=N;x+=x&-x) tree[ty][x]+=delta;}
inline int query(int ty, int x){int sum=; for(;x;x-=x&-x) sum+=tree[ty][x]; return sum;}
inline int min(int a, int b){return a<b?a:b;}
int main()
{
read(n); blo=sqrt(n);
for(int i=;i<=n;i++) bl[i]=(i-)/blo+;
for(int i=;i<=n;i++) read(a[i]), b[i]=a[i]; N=n;
sort(b+, b++n); N=unique(b+, b++N)-b-;
for(int i=;i<=n;i++) a[i]=lower_bound(b+, b++N, a[i])-b;
for(int i=n;i;i--) ans+=query(, a[i]-), update(, a[i], );
printf("%d\n", ans);
for(int i=;i<=n;i++) update(bl[i], a[i], );
read(m);
for(int i=;i<=m;i++)
{
read(l); read(r); if(l>r) swap(l, r);
int L=l+, R=r-;
if(L<=R)
{
for(int j=L;j<=min(R, bl[L]*blo);j++)
ans+=(a[j]>a[l]), ans-=(a[j]<a[l]), ans+=(a[j]<a[r]), ans-=(a[j]>a[r]);
if(bl[L]!=bl[R]) for(int j=(bl[R]-)*blo+;j<=R;j++)
ans+=(a[j]>a[l]), ans-=(a[j]<a[l]), ans+=(a[j]<a[r]), ans-=(a[j]>a[r]);
for(int j=bl[L]+;j<bl[R];j++)
ans-=query(j, a[l]-), ans+=query(j, N)-query(j, a[l]),
ans-=query(j, N)-query(j, a[r]), ans+=query(j, a[r]-);
}
if(a[l]<a[r]) ans++; else if(a[l]>a[r]) ans--;
if(bl[l]!=bl[r])
update(bl[l], a[l], -), update(bl[l], a[r], ),
update(bl[r], a[r], -), update(bl[r], a[l], );
swap(a[l], a[r]);
printf("%d\n", ans);
}
}
bzoj2141: 排队(分块+树状数组)的更多相关文章
- BZOJ2141:排队(分块,树状数组)
Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们 ...
- 【bzoj2141】排队 分块+树状数组
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别, ...
- 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 排队(分块+树状数组)
题意 第一行为一个正整数n,表示小朋友的数量:第二行包含n个由空格分隔的正整数h1,h2,…,hn,依次表示初始队列中小朋友的身高:第三行为一个正整数m,表示交换操作的次数:以下m行每行包含两个正整数 ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- 【XSY2111】Chef and Churus 分块 树状数组
题目描述 有一个长度为\(n\)的数组\(A\)和\(n\)个区间\([l_i,r_i]\),有\(q\)次操作: \(1~x~y\):把\(a_x\)改成\(y\) \(2~x~y\):求第\(l\ ...
随机推荐
- [文章存档]Azure .net WebAPP的js/css文件过大导致访问慢的解决办法
https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/aog-app-service-web-qa-j ...
- centos7.6 安装配置rabbitmq
IP地址:192.168.200.108 安装erlang 和 依赖环境 yum install -y socat yum install -y erlang 安装rabbitmq yum insta ...
- Sentence | Never underestimate yourself.
"\(Our\) \(deepest\) \(fear\) \(is\) \(not\) \(that\) \(we\) \(are\) $inadequate. $ \(Our\) \(d ...
- 06-matplotlib-饼状图
import numpy as np import matplotlib.pyplot as plt ''' 饼状图显示一个数据系列中各项总和的比例: 饼状图中的数据点显示为整个饼状图的百分比: 如: ...
- PASSWORD MySQL 5.6.21-1ubuntu14.04_amd64
/***************************************************************************** The main idea is that ...
- 记录一次redis故障
ResponseError: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persi ...
- Kubernetes探索学习002--Kubernetes的基本使用
Kubernetes 的基本使用方法 原则:使用YAML文件描述你要部署的API对象! 以部署nginx静态站点为例,具体操作及内容如下 1.编写YAML文件 [root@kubernetes01 ~ ...
- Node.js中exports,module.exports以及require方法
在Node.js中,使用module.exports.f = ...与使用exports.f = ...是一样的,此时exports就是module.exports的一种简写方式.但是,需要注意的是, ...
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算
一.结对对象 姓名:侯泽洋 学号:20172308 担任角色:驾驶员(侯泽洋) 伙伴第一周博客地址 二.本周内容 1.程序需求 (1).自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能 ...
- 数据库,总结,新技能get
上来先粘代码吧,这篇本来就不是用来让你们看的,我就是单纯的记录下,嗯~对,总结!!! 首先:first //绑定年份 YearSearch.Items.Clear(); for (int i = Da ...