BZOJ2141: 排队
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2141
分块加树状数组。
离散化之后,每一个块建一个树状数组。交换x,y,与x左边的数和y右边的数无关,只需处理>x,<y的数。
话说还可以用树套树来写,不过常数太大,比分块加树状数组慢。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define inf 1<<30
#define maxn 20005
using namespace std;
int n,m,nn,tot,ans,a[maxn],t[][maxn];
struct fuck{int x,id;}c[maxn];
int read(){
int x=,f=; char ch;
for(ch=getchar();ch<''||ch>'';ch=getchar()) if(ch=='-') f=-;
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-'';
return x*f;
}
bool comp(fuck a,fuck b){return a.x<b.x;}
int p(int x){return (x-)/nn+;}
void change(int f,int x,int y){for(int i=x;i<=tot;i+=i&-i) t[f][i]+=y;}
int query(int f,int x){int y=;for(int i=x;i;i-=i&-i) y+=t[f][i];return y;}
int main(){
n=read(); nn=sqrt(n);
for(int i=;i<=n;i++) c[i].x=read(),c[i].id=i;
sort(c+,c+n+,comp);
for(int i=;i<=n;i++){
if(c[i].x!=c[i-].x) ++tot;
a[c[i].id]=tot;
}
for(int i=n;i;i--){
ans+=query(,a[i]-);
change(,a[i],);
}
printf("%d\n",ans);
for(int i=;i<=n;i++) change(p(i),a[i],);
m=read();
int x,y;
while(m--){
x=read(); y=read(); if(x>y) swap(x,y);
for(int i=p(x)+;i<p(y);i++){
ans-=query(i,a[x]-); ans+=query(i,tot)-query(i,a[x]);
ans-=query(i,tot)-query(i,a[y]); ans+=query(i,a[y]-);
}
for(int i=x+;p(i)==p(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(p(x)!=p(y))
for(int i=y-;p(i)==p(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++; if(a[x]>a[y]) ans--;
change(p(x),a[x],-); change(p(x),a[y],);
change(p(y),a[y],-); change(p(y),a[x],);
swap(a[x],a[y]);
printf("%d\n",ans);
}
return ;
}
BZOJ2141: 排队的更多相关文章
- BZOJ2141 排队 树状数组 分块
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2141.html 题目传送门 - BZOJ2141 题意 给定一个序列 $a$ ,先输出原先的逆序对数. ...
- bzoj2141排队(辣鸡但是好写的方法)
题意很明确,也非常经典: 一个支持查询 区间中比k大的数的个数 并且支持单点修改的序列 ——因为题意可以转化为:查询这两个数中比后者大的个数.比后者小的个数.比前者大的个数.比前者小的个数(根据这4个 ...
- bzoj2141排队
/* 动态求逆序对,可以树套树来写, 将交换操作理解成插入和删除比较好理解, 里层是个区间求和的线段树就好了 或者叫 带修主席树? */ #include<cstdio> #include ...
- BZOJ2141排队——树状数组套权值线段树(带修改的主席树)
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...
- bzoj2141: 排队(分块+树状数组)
块套树为什么会这么快.. 先跑出原序列逆序对. 显然交换两个位置$l,r$,对$[1,l),(r,n]$里的数没有影响,所以只需要考虑$[l,r]$内的数. 设$(l,r)$内的数$a_i$,则按以下 ...
- BZOJ2141:排队(分块,树状数组)
Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们 ...
- 【分块】【树套树】bzoj2141 排队
考虑暴力更新的情况,设swap的是L,R位置的数.swap之后的逆序对数应该等于:之前的逆序对数+[L+1,R-1]中比 L位置的数 大的数的个数-[L+1,R-1]中比 L位置的数 小的数的个数-[ ...
- [bzoj2141][排队] (分块大法好)
Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的 ...
- 树套树Day1线段树套平衡树bzoj3196
您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查 ...
随机推荐
- Linux Ubuntu 虛擬機系統自定義桌面分辨率且重啓後保持不變
我用 VMware Workstation 12 Pro 安裝的 Ubuntu MATE Desktop Environment 1.12.1,發現安裝後沒有需要的分辨率,於是安裝 VMware To ...
- vue+vuex初入门
Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 解决问题: 传参的方法对于多层嵌 ...
- MyEclipse 中文注释乱码
window-->preference-->general-->content type然后在<Content Types>中展开每一个子项,并在<Default ...
- OllyDBG V1.10聆风听雨汉化版
软件名称:OllyDBG V1.10聆风听雨汉化版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 3.84MB 图片预览: 软件简介: Ollydbg2. ...
- Apache 关于 mod_rewrite 遇到 %2F或%5C (正反斜杠)等特殊符号导致URL重写失效出现404的问题
.htaccess 文件 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d Rew ...
- AnimatorController反向运动学IK
通过使用反向运动学IK,我们可以根据需要控制角色身体某个特定部位进行旋转或移动,达到想要的一些效果,比如:在移动时,让一只脚带伤拖行:让手抬起去拿桌上的苹果:让脑袋一直面向我们的色像机,就像一直注视着 ...
- IntentService和Service的区别
整个看下来是一个Service+Thread+handle的结合体, Service:比Activity的被kill的级别低 Thread:不阻塞UI线程 Handle:队列式的消息循环 那这个玩意的 ...
- ansible role 执行顺序
the dependencies of the 'openshift-master' role.- docker- openshif_common - os_firewall - openshi ...
- c#中命令copy已退出,返回值为1
c#中命令copy已退出,返回值为1 本正经的道:董姐刚才你说的修心养性其中的'修心'我 有孕在身刚好由戴梦瑶顶替了她的位置按照的指示 ╋旆呆 湎术葶页 邾箕砜笳 烦璜卿廑 奶奶个腿儿的等下次非让你 ...
- python 学习 [day8]class成员
一.类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对 ...