【Luogu】P3157动态逆序对(树状数组套主席树)
md第一道在NOILinux 下用vim做的紫题。由于我对这个操作系统不是很熟悉,似乎有什么地方搞错了,md调死。(我还打了两遍代码,调了两个小时)
但是这道题并不难,就是树状数组套上主席树……这应该是带修改主席树的套路,可以同时满足逆序对要求的位置和大小两个条件。
不过还是调了很长时间……反映出我数据结构方面的能力极为薄弱
最后放代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<cstdlib>
#define maxn 500020
#define mid ((l+r)>>1)
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int sum[maxn*];
int rt[maxn*];
int ls[maxn*];
int rs[maxn*];
int c[maxn*];
int q[maxn],back[maxn];
int x[maxn],y[maxn];
int a1[maxn],a2[maxn];
int n,m;
int tot; inline int low(int i){ return i&(-i); } inline int ask(int pos){
int ans=;
while(pos){
ans+=c[pos];
pos-=low(pos);
}
return ans;
} int querypre(int from,int to,int e){
int l=,r=n;int totx=,toty=,ans=; from--;
for(int i=from;i;i-=low(i)) x[++totx]=rt[i];
for(int i=to;i;i-=low(i)) y[++toty]=rt[i];
while(l<r){
if(e>mid){
for(int i=;i<=totx;++i) ans-=sum[ls[x[i]]];
for(int i=;i<=toty;++i) ans+=sum[ls[y[i]]];
for(int i=;i<=totx;++i) x[i]=rs[x[i]];
for(int i=;i<=toty;++i) y[i]=rs[y[i]];
l=mid+;
}
else{
for(int i=;i<=totx;++i) x[i]=ls[x[i]];
for(int i=;i<=toty;++i) y[i]=ls[y[i]];
r=mid;
}
}
return ans;
} int querysub(int from,int to,int e){
int l=,r=n;int totx=,toty=,ans=; from--;
for(int i=from;i;i-=low(i)) x[++totx]=rt[i];
for(int i=to;i;i-=low(i)) y[++toty]=rt[i];
while(l<r){
if(e<=mid){
for(int i=;i<=totx;++i) ans-=sum[rs[x[i]]];
for(int i=;i<=toty;++i) ans+=sum[rs[y[i]]];
for(int i=;i<=totx;++i) x[i]=ls[x[i]];
for(int i=;i<=toty;++i) y[i]=ls[y[i]];
r=mid;
}
else{
for(int i=;i<=totx;++i) x[i]=rs[x[i]];
for(int i=;i<=toty;++i) y[i]=rs[y[i]];
l=mid+;
}
}
return ans;
} void update(int &o,int l,int r,int p){
if(!o) o=++tot; sum[o]++;
if(l==r) return;
if(p<=mid) update(ls[o],l,mid,p);
else update(rs[o],mid+,r,p);
} int main(){
n=read(),m=read();
for(int i=;i<=n;++i){
q[i]=read();back[q[i]]=i;
}
long long ans=;
for(int i=;i<=n;++i){
a1[i]=ask(n)-ask(q[i]);
ans+=a1[i];
for(int j=q[i];j<=n;j+=low(j)) c[j]++;
}
memset(c,,sizeof(c));
for(int i=n;i;--i){
a2[i]=ask(q[i]-);
for(int j=q[i];j<=n;j+=low(j)) c[j]++;
}
for(int i=;i<=m;++i){
printf("%lld\n",ans);
int pos=read();pos=back[pos];
ans-=(a1[pos]+a2[pos]-querypre(pos+,n,q[pos])-querysub(,pos-,q[pos]));
for(int j=pos;j<=n;j+=low(j)) update(rt[j],,n,q[pos]);
}
return ;
}
【Luogu】P3157动态逆序对(树状数组套主席树)的更多相关文章
- [COGS257]动态排名系统 树状数组套主席树
257. 动态排名系统 时间限制:5 s 内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...
- LUOGU P2617 Dynamic Rankings(树状数组套主席树)
传送门 解题思路 动态区间第\(k\)大,树状数组套主席树模板.树状数组的每个位置的意思的是每棵主席树的根,维护的是一个前缀和.然后询问的时候\(log\)个点一起做前缀和,一起移动.时空复杂度\(O ...
- 【Luogu】P2617Dynamic Ranking(树状数组套主席树)
题目链接 树状数组套主席树有点难懂qwq 不好理解 树状数组套主席树的直观理解应该是:树状数组的每一个节点是一棵主席树. 普通区间修改我们是创建1个线段树,树状数组套主席树的时候我们就创建log个线段 ...
- BZOJ 2141 排队(树状数组套主席树)
解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...
- Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)
E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...
- [BZOJ3932] [CQOI2015]任务查询系统(主席树 || 树状数组 套 主席树 + 差分 + 离散化)
传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个. 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点, ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树
[题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...
- BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树
BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...
- ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...
随机推荐
- Red Hat Enterprise Linux(RHEL)中yum的repo文件详解
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下载 ...
- UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
摘要:中途相遇.对比map,快排+二分查找,Hash效率. n是4000的级别,直接O(n^4)肯定超,所以中途相遇法,O(n^2)的时间枚举其中两个的和,O(n^2)的时间枚举其他两个的和的相反数, ...
- 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3
[程序介绍]免费开源的 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3 这是一个有意思的程序,同一个程序,即是图形程序,又是命令行程序.程序作用:输入一个文件的路径,输出 ...
- 剑指offer46 求1+2+...+n 以及& &&区别
参考代码: class Solution { public: int Sum_Solution(int n) { int result = n; result && (result + ...
- Cross-Entropy Loss 与Accuracy的数值关系(很重要,很好的博客)
http://www.cnblogs.com/dengdan890730/p/6132937.html
- oracle 命中率
一般在I/O 使用中,为了提高系统处理速度,系统提前将数据读入一块内存区,叫高速缓存,但提前读入的数据未必就是需要的,这就是命中率..计算公式为 命中率=1-(physical reads/(db b ...
- 吐槽在cocos2dx游戏接入腾讯信鸽的坑
腾讯信鸽是用来在后台推送消息给移动应用客户端使用,接入方法很简单,在信鸽官网注册个账号 http://xg.qq.com/xg,然后注册一个应用,在后台页面获得ACCESS ID, ACCESS KE ...
- NOIP模拟赛 麻将
[题目描述] 众所周知,麻将是我们国家的国粹.这段时间,小D也迷上了麻将这个老少皆宜的游戏. 小D觉得这些不同规则的麻将太麻烦了,所以他集合了很多种麻将规则创造出了一套D麻将.下面是D麻将的几个特点: ...
- centos7重启后/etc/resolv.conf 被还原解决办法
每次重启服务器后,/etc/resolv.conf文件就被自动还原了,最后发现是被Network Manager修改了. 查看Network Manager服务状态 systemctl status ...
- for_each_node(node)
遍历各个pg_data_t节点. 1.定义在include/linux/nodemask.h中 /* * Bitmasks that are kept for all the nodes. */ en ...