题目描述

排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和。

红星幼儿园的小朋友们排起了长长地队伍,准备吃果果。不过因为小朋友们的身高有所区别,排成的队伍高低错乱,极不美观。设第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]排队(树套树)的更多相关文章

  1. 【bzoj2141】排队 [国家集训队2011]排队(魏铭) 树套树 线段树套替罪羊树

    这个题就是动态偏序对,每次操作做两个删除两个插入就好了. #include<cstdio> #include<iostream> #include<cstring> ...

  2. COGS1871 [国家集训队2011]排队(魏铭)

    bzoj:http://www.lydsy.com/JudgeOnline/problem.php?id=2141 cogs:http://cogs.pro:8080/cogs/problem/pro ...

  3. 【BZOJ2141】排队(树套树)

    [BZOJ2141]排队(树套树) 题面 BZOJ 洛谷 题解 傻逼题啊... 裸的树套树 树状数组套线段树,每次交换的时候,考虑一下前后的贡献,先删掉贡献,再重新算一遍就好了.. #include& ...

  4. 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】

    题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...

  5. AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867

    [国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...

  6. cogs 1901. [国家集训队2011]数颜色

    Cogs 1901. [国家集训队2011]数颜色 ★★★   输入文件:nt2011_color.in   输出文件:nt2011_color.out   简单对比时间限制:0.6 s   内存限制 ...

  7. BZOJ 2150 cogs 1861 [国家集训队2011]部落战争

    题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb把 ...

  8. 树套树Day1线段树套平衡树bzoj3196

    您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查 ...

  9. P4175 [CTSC2008]网络管理 树剖+树套树

    $ \color{#0066ff}{ 题目描述 }$ M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通 ...

随机推荐

  1. 《你必须知道的495个C语言问题》读书笔记之第8-10章:字符串、布尔类型和预处理器

    一.字符和字符串 1. Q:为什么strcat(string, '!')不行? A:strcat()用于拼接字符串,所以应该写成strcat(string, "!")." ...

  2. 关于HTTP返回码

    301与302区别: 301 重定向 三种主流搜索引擎(Google, Bing, Yahoo)对待301都是一样的.它们忽略原始链接然后把重定向后的新链接加入索引.例如:如果用301把 http:/ ...

  3. oracle分区表原理学习

    1.创建普通表 create table normal_shp(id number,day date,city_number number,note varchar2(100)) tablespace ...

  4. centos7.4安装图形界面及报错处理

    笔者实验环境:centos 7.4.1708,安装时默认最小化安装. 安装命令: yum -y update #如果不想升级内核版本可以参考笔者另一篇文章,关于update跟upgrade的区别yum ...

  5. 请给出一个Scala RDD的HelloWorld例子

    [学习笔记]package comimport org.apache.spark.rdd.RDDimport org.apache.spark.SparkConfimport org.apache.s ...

  6. Elasticsearch使用小结之冷热分离

    Elasticsearch使用小结之冷热分离 索引迁移 索引setting中的index.routing.allocation.exclude和index.routing.allocation.inc ...

  7. LC 394. Decode String

    问题描述 Given an encoded string, return its decoded string. The encoding rule is: k[encoded_string], wh ...

  8. 【Python基础】11_Python中的字符串

    1.字符串的定义 可以使用""双引号,也可以使用''单引号定义字符串,一般使用双引号定义. 2.字符串的操作 判断类型: 查找和替换 大小写切换: 文本对齐 注:string.ce ...

  9. ingress安装配置

    Traefik Traefik 是一款开源的反向代理与负载均衡工具.它最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置.目前支持 Docker.Swarm.Mesos/Maratho ...

  10. 消息服务百科全书——Kafka基本原理介绍

    架构 1.1 总体架构 因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理. 为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区.多个生产者和消费者能够同时生产和获取消息. 一 ...