【bzoj2141】排队 [国家集训队2011]排队(树套树)
题目描述
排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和。
红星幼儿园的小朋友们排起了长长地队伍,准备吃果果。不过因为小朋友们的身高有所区别,排成的队伍高低错乱,极不美观。设第i个小朋友的身高为hi,我们定义一个序列的杂乱程度为:满足i<j且hi>hj的(i,j)数量。
幼儿园阿姨每次会选出两个小朋友,交换他们的位置,请你帮忙计算出每次交换后,序列的杂乱程度。为方便幼儿园阿姨统计,在未进行任何交换操作时,你也应该输出该序列的杂乱程度。
题解
新技能get
树状数组+动态开点线段树
具体看代码(因为我讲不来)
//minamoto
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(int x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
struct node{
int v,id;
inline bool operator <(const node &b)const{return v<b.v;}
}a[N];
int n,m,x,y,tot,ans,b[N],c[N];
inline void add(int x){
for(;x<=n;x+=x&-x) ++c[x];
}
inline int sum(int x){
int res=;
for(;x;x-=x&-x) res+=c[x];
return res;
}
int cnt,rt[N],v[N*],L[N*],R[N*];
void insert(int &u,int l,int r,int x,int k){
if(!u) u=++cnt;v[u]+=k;
if(l==r) return;int mid=l+r>>;
if(x<=mid) insert(L[u],l,mid,x,k);
else insert(R[u],mid+,r,x,k);
}
void push(int x,int y,int k){
for(;x<=n;x+=x&-x) insert(rt[x],,n,y,k);
}
int Query(int u,int l,int r,int ql,int qr){
if(!u) return ;
if(ql<=l&&qr>=r) return v[u];
int mid=l+r>>;
int res=;
if(ql<=mid) res+=Query(L[u],l,mid,ql,qr);
if(qr>mid) res+=Query(R[u],mid+,r,ql,qr);
return res;
}
int query(int l,int r,int ql,int qr){
if(l>r||ql>qr) return ;
int sum=;--l;
for(;r;r-=r&-r) sum+=Query(rt[r],,n,ql,qr);
for(;l;l-=l&-l) sum-=Query(rt[l],,n,ql,qr);
return sum;
}
int main(){
//freopen("testdata.in","r",stdin);
n=read();
for(int i=;i<=n;++i) a[i]=(node){read(),i};
sort(a+,a++n);
for(int i=;i<=n;++i){
if(a[i].v!=a[i-].v) ++tot;
b[a[i].id]=tot;
}
for(int i=n;i;--i) ans+=sum(b[i]-),add(b[i]);
for(int i=;i<=n;++i) push(i,b[i],);
m=read(),print(ans);
while(m--){
int x=read(),y=read();
if(x>y) swap(x,y);
ans+=query(x+,y-,,b[y]-);
ans-=query(x+,y-,b[y]+,n);
ans+=query(x+,y-,b[x]+,n);
ans-=query(x+,y-,,b[x]-);
if(b[x]>b[y]) --ans;
if(b[x]<b[y]) ++ans;
push(x,b[x],-),push(y,b[y],-);
push(y,b[x],),push(x,b[y],);
swap(b[x],b[y]);
print(ans);
}
Ot();
return ;
}
【bzoj2141】排队 [国家集训队2011]排队(树套树)的更多相关文章
- 【bzoj2141】排队 [国家集训队2011]排队(魏铭) 树套树 线段树套替罪羊树
这个题就是动态偏序对,每次操作做两个删除两个插入就好了. #include<cstdio> #include<iostream> #include<cstring> ...
- COGS1871 [国家集训队2011]排队(魏铭)
bzoj:http://www.lydsy.com/JudgeOnline/problem.php?id=2141 cogs:http://cogs.pro:8080/cogs/problem/pro ...
- 【BZOJ2141】排队(树套树)
[BZOJ2141]排队(树套树) 题面 BZOJ 洛谷 题解 傻逼题啊... 裸的树套树 树状数组套线段树,每次交换的时候,考虑一下前后的贡献,先删掉贡献,再重新算一遍就好了.. #include& ...
- 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】
题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...
- AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867
[国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...
- cogs 1901. [国家集训队2011]数颜色
Cogs 1901. [国家集训队2011]数颜色 ★★★ 输入文件:nt2011_color.in 输出文件:nt2011_color.out 简单对比时间限制:0.6 s 内存限制 ...
- BZOJ 2150 cogs 1861 [国家集训队2011]部落战争
题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb把 ...
- 树套树Day1线段树套平衡树bzoj3196
您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查 ...
- P4175 [CTSC2008]网络管理 树剖+树套树
$ \color{#0066ff}{ 题目描述 }$ M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通 ...
随机推荐
- DB2创建EMP和DEPT并进行基础操作
一.DB2创建EMP和DEPT测试表 --DB2创建测试表 CREATE TABLE TEST.EMP (EMPNO INTEGER NOT NULL, ENAME ), JOB ), MGR INT ...
- c++ 之private /protect/ public
C++中public.protect.private的访问权限控制 访问权限 一个类的public成员变量.成员函数,可以通过类的成员函数.类的实例变量进行访问 一个类的protected成员变量.成 ...
- Linux基础指令--文件操作
mkdir a 创建一个名为a的文件夹 touch a.txt 创建一个名为a.txt的文件 mv b sm/ 将文件(夹)b 移动到当前目录下的sm目录下 rm -rf a 删除 a文件 -rf为参 ...
- 为什么要使用 SPL中的 SplQueue实现队列
今天看php的SPL标准库部分里面涉及到数据结构其中有 SplQueue 来实现队列效果,但是我刚接触php的时候学习到的是 使用array的 array_push 和 array_pop 就可以实现 ...
- python — 生成器、推导式、递归
目录 1 生成器(函数的变异) 2 推导式 3 递归 1 生成器(函数的变异) 判断一个函数是否是生成器函数:只需看函数内部是否有yield # 生成器函数(内部是否包含yield) def func ...
- hdu 6045 多校签到题目
http://acm.hdu.edu.cn/showproblem.php?pid=6045 题解:遍历一遍,求出两个人答案中相同的个数,用wa表示.然后我从大的数入手,当wa的数都尽可能在两个人答案 ...
- hdu 1269 入手强连通
思路待整理 #include<cstdio> #include<iostream> #include<cstring> #include<vector> ...
- 3-MySQL DBA笔记-开发基础
第二部分 开发篇 本篇首先讲述数据库开发的一些基础知识,如关系数据模型.常用的SQL语法.范式.索引.事务等,然后介绍编程开发将会涉及的数据库的一些技巧,最后结合生产实际,提供一份开发规范供大家参考. ...
- [JZOJ100026]图--倍增
[JZOJ100026]图--倍增 题目链接 太懒了,自行搜索 分析 裸倍增,不多说 \(fa[i][j]\)表示\(i\)跳\(2^j\)步走到的点 \(f[i][j]\)表示\(i\)跳\(2^j ...
- Zookeeper 入门详解
zookeeper zookeeper是什么 Apache ZooKeeper是Apache软件基金会的一个软件项目,他为大型分布式计算提供开源的分布式配置服务.同步服务和命名注册.ZooKeeper ...