BZOJ2141排队——树状数组套权值线段树(带修改的主席树)
题目描述
输入
输出
输出文件共m行,第i行一个正整数表示交换操作i结束后,序列的杂乱程度。
样例输入
3
130 150 140
2
2 3
1 3
样例输出
0
3
【样例说明】
未进行任何操作时,(2,3)满足条件;
操作1结束后,序列为130 140 150,不存在满足i<j且hi>hj的(i,j)对;
操作2结束后,序列为150 140 130,(1,2),(1,3),(2,3)共3对满足条件的(i,j)
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n,m;
int x,y;
int tot;
int cnt;
int ans;
int s[20010];
int t[20010];
int a[20010];
int b[20010];
int v[20010];
int root[20010];
int ls[10000010];
int rs[10000010];
int sum[10000010];
void add(int x)
{
for(int i=x;i<=tot;i+=i&-i)
{
v[i]++;
}
}
int ask(int x)
{
int res=0;
for(int i=x;i;i-=i&-i)
{
res+=v[i];
}
return res;
}
void change(int &rt,int l,int r,int k,int v)
{
if(!rt)
{
rt=++cnt;
}
if(l==r)
{
sum[rt]+=v;
return ;
}
sum[rt]+=v;
int mid=(l+r)>>1;
if(k<=mid)
{
change(ls[rt],l,mid,k,v);
}
else
{
change(rs[rt],mid+1,r,k,v);
}
}
int query_min(int l,int r,int k)
{
int res=0;
if(l==r)
{
return res;
}
int mid=(l+r)>>1;
if(k<=mid)
{
for(int i=1;i<=s[0];i++)
{
s[i]=ls[s[i]];
}
for(int i=1;i<=t[0];i++)
{
t[i]=ls[t[i]];
}
return query_min(l,mid,k);
}
else
{
for(int i=1;i<=s[0];i++)
{
res+=sum[ls[s[i]]];
s[i]=rs[s[i]];
}
for(int i=1;i<=t[0];i++)
{
res-=sum[ls[t[i]]];
t[i]=rs[t[i]];
}
return res+query_min(mid+1,r,k);
}
}
int query_max(int l,int r,int k)
{
int res=0;
if(l==r)
{
return res;
}
int mid=(l+r)>>1;
if(k<=mid)
{
for(int i=1;i<=s[0];i++)
{
res+=sum[rs[s[i]]];
s[i]=ls[s[i]];
}
for(int i=1;i<=t[0];i++)
{
res-=sum[rs[t[i]]];
t[i]=ls[t[i]];
}
return res+query_max(l,mid,k);
}
else
{
for(int i=1;i<=s[0];i++)
{
s[i]=rs[s[i]];
}
for(int i=1;i<=t[0];i++)
{
t[i]=rs[t[i]];
}
return query_max(mid+1,r,k);
}
}
void updata(int x,int k,int v)
{
for(int i=x;i<=n;i+=i&-i)
{
change(root[i],1,tot,k,v);
}
}
int find_max(int l,int r,int k)
{
s[0]=t[0]=0;
for(int i=r;i;i-=i&-i)
{
s[++s[0]]=root[i];
}
for(int i=l;i;i-=i&-i)
{
t[++t[0]]=root[i];
}
return query_max(1,tot,k);
}
int find_min(int l,int r,int k)
{
s[0]=t[0]=0;
for(int i=r;i;i-=i&-i)
{
s[++s[0]]=root[i];
}
for(int i=l;i;i-=i&-i)
{
t[++t[0]]=root[i];
}
return query_min(1,tot,k);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
tot=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++)
{
a[i]=lower_bound(b+1,b+1+tot,a[i])-b;
ans+=ask(tot)-ask(a[i]);
add(a[i]);
updata(i,a[i],1);
}
printf("%d\n",ans);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
ans+=find_min(x,y-1,a[y]);
ans-=find_max(x,y-1,a[y]);
ans-=find_min(x,y-1,a[x]);
ans+=find_max(x,y-1,a[x]);
updata(x,a[x],-1);
updata(y,a[y],-1);
swap(a[x],a[y]);
updata(x,a[x],1);
updata(y,a[y],1);
if(a[x]>a[y])
{
ans++;
}
else if(a[x]<a[y])
{
ans--;
}
printf("%d\n",ans);
}
}
BZOJ2141排队——树状数组套权值线段树(带修改的主席树)的更多相关文章
- luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...
- CF1093E Intersection of Permutations 树状数组套权值线段树
\(\color{#0066ff}{ 题目描述 }\) 给定整数 \(n\) 和两个 \(1,\dots,n\) 的排列 \(a,b\). \(m\) 个操作,操作有两种: \(1\ l_a\ r_a ...
- Dynamic Rankings(树状数组套权值线段树)
Dynamic Rankings(树状数组套权值线段树) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[ ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- 刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)
题目: Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说 ...
- BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...
- BZOJ 2120 数颜色(树状数组套主席树)
1A啊,激动. 首先,不修改的情况下可以直接用主席树搞,修改的话,直接用主席树搞一次修改的情况下复杂度是O(nlogn)的. 就像你要求区间和一样,用前缀和查询是O(1),修改是O(n),只不过主席树 ...
- LUOGU P2617 Dynamic Rankings(树状数组套主席树)
传送门 解题思路 动态区间第\(k\)大,树状数组套主席树模板.树状数组的每个位置的意思的是每棵主席树的根,维护的是一个前缀和.然后询问的时候\(log\)个点一起做前缀和,一起移动.时空复杂度\(O ...
随机推荐
- 软概(lesson 1):Javaweb实现用户登录界面
一.问题描述 二.网站系统开发所需要的技术 网站界面开发:html 后台所需要的技术:java基本内容,数据库语句,连接数据库实现增删改查 本题所用技术:数据库链接以及增加功能,基本html语句 技术 ...
- co模块源码学习笔记
// Sorrow.X --- 添加注释,注释纯属个人理解 /** * slice变量 引用 数组的 slice方法 */ var slice = Array.prototype.slice; /** ...
- BP浅谈
之前一直对BP的理解不透彻,这可不行,这个可是超经典的广泛应用在ML中的求偏导的方法.本博来自<神经网络与机器学习>P86页. 在用到bp的地方我们都是为了使用梯度下降法,并求出他的偏导数 ...
- 浅谈传感器常用Delta-SigmaADC
过采样ADC,或噪声整形ADC,也叫Delta-Sigma ADC.名字很多,基本上都由求差电路,积分求和电路组成调制器,后续由数字滤波器获得Nbit数字输出.不管怎样,数学上的除法能够让你理解这类A ...
- 数列分块入门九题(一):LOJ6277~6279
Preface 分块,一个神奇的暴力算法.可以把很多\(O(n^2)\)的数据结构题的暴力优化到常数极小的\(O(n\sqrt n)\).当一些毒瘤题无法用线段树,主席树,平衡树,树状数组...... ...
- python第二周
第二周,PYTHON图形绘制 一,计算机技术的演进发展 1946-1981.从第一台计算机的诞生到IBM的PC机的出现,我们称之为”计算机系统结构时代“.————这个时代重点在解决计算能力问题 198 ...
- PHP实现验证码制作
captcha.php(PHP产生验证码并储存Session): <?php //开启Session session_start(); //绘制底图 $image = imagecreatetr ...
- zabbix中配置当memory剩余不足20%时触发报警
在zabbix中默认当内存剩余量不足2G的时候触发报警,并没有使用百分比来触发如下: 现在需要配置:当memory剩余不足20%时触发报警,具体操作方法如下: 1)创建itemConfiguratio ...
- Maven 项目生成或者update jdk变为1.5的问题
在使用Maven构建项目时,生成的maven项目jdk默认使用的是jdk1.5. 在手动修改了jdk之后,update project之后jdk又会变为1.5. 或者用eclipse的Maven插件生 ...
- HDU 3537 Daizhenyang's Coin
链接 [http://acm.hdu.edu.cn/showproblem.php?pid=3537] 题意 题意:已知一排硬币中有n个硬币正面朝上,输入正面朝上的硬币的位置ai.两人轮流操作, 每次 ...