洛谷P3157 [CQOI2011]动态逆序对
题目大意:
给定\(1\)到\(n\)的一个排列,按照给定顺序依次删除\(m\)个元素,计算每个元素删除之前整个序列的逆序对数量
基本套路:删边变加边
那么我们不就是求满足\(pos_i<pos_j,tim_i<tim_j,num_i>num_j\)的数量嘛
先按\(tim\)排序,然后归并\(pos_i\),树状数组\(num_i\)
不过这道题我们需要正反跑两个\(cdq\),因为我们需要分开统计\(pos_i<pos_j,num_i>num_j\)和\(pos_i>pos_j,num_i<num_j\)的贡献
但是我压缩到一个\(cdq\)里了\(emmmm\)
需要稍微注意的一点是,我们需要把答案累加的令一个\(ret_i\)数组中,其中\(ret_i\)表示在\(i\)时刻新产生了多少逆序对,最后还需要输出前缀和
不粘代码是不是太短了
#include<bits/stdc++.h>
using namespace std;
namespace red{
#define int long long
#define mid ((l+r)>>1)
#define lowbit(x) ((x)&(-x))
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
const int N=1e5+10;
int n,m,idx,tot;
int pos[N];
int st[N];
int ret[N];
struct point
{
int x,id,tim;
int val;
inline bool operator < (const point &t) const
{
if(tim^t.tim) return tim<t.tim;
return id<t.id;
}
}a[N<<2],t[N<<2];
int tr[N<<1];
inline void update(int x,int k)
{
for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=k;
}
inline int query(int y)
{
int ret=0;
for(int i=y;i;i-=lowbit(i))
ret+=tr[i];
return ret;
}
inline void cdq(int l,int r)
{
if(l==r) return;
cdq(l,mid);
cdq(mid+1,r);
int tl=l,tr=mid+1,tot=l;
while(tl<=mid&&tr<=r)
{
if(a[tl].id<=a[tr].id) update(a[tl].x,1),t[tot++]=a[tl++];
else ret[a[tr].tim]+=query(n)-query(a[tr].x),t[tot++]=a[tr++];
}
while(tl<=mid) update(a[tl].x,1),t[tot++]=a[tl++];
while(tr<=r) ret[a[tr].tim]+=query(n)-query(a[tr].x),t[tot++]=a[tr++];
for(int i=l;i<=mid;++i) update(a[i].x,-1);
tl=mid,tr=r;
while(tl>=l&&tr>=mid+1)
{
if(a[tl].id>=a[tr].id) update(a[tl].x,1),--tl;
else ret[a[tr].tim]+=query(a[tr].x-1),--tr;
}
while(tl>=l) update(a[tl].x,1),--tl;
while(tr>=mid+1) ret[a[tr].tim]+=query(a[tr].x-1),--tr;
for(int i=l;i<=mid;++i) update(a[i].x,-1);
for(int i=l;i<=r;++i) a[i]=t[i];
}
inline void main()
{
n=read(),m=read();
for(int x,i=1;i<=n;++i)
{
x=read();
pos[x]=i;
a[i].x=x;
a[i].id=i;
a[i].tim=1;
}
for(int x,tmp,i=1;i<=m;++i)
{
x=read();
tmp=pos[x];
a[tmp].tim=m-i+2;
}
sort(a+1,a+n+1);
cdq(1,n);
for(int i=1;i<=m+1;++i) ret[i]+=ret[i-1];
for(int i=m+1;i>=2;--i) printf("%lld\n",ret[i]);
}
}
signed main()
{
red::main();
return 0;
}
洛谷P3157 [CQOI2011]动态逆序对的更多相关文章
- 洛谷 P3157 [CQOI2011]动态逆序对 解题报告
P3157 [CQOI2011]动态逆序对 题目描述 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n ...
- 洛谷 P3157 [CQOI2011]动态逆序对(树套树)
题面 luogu 题解 树套树(树状数组套动态开点线段树) 静态使用树状数组求逆序对就不多说了 用线段树代替树状数组,外面套树状数组统计每个点逆序对数量 设 \(t1[i]\)为\(i\)前面有多少个 ...
- 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治
题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- P3157 [CQOI2011]动态逆序对
P3157 [CQOI2011]动态逆序对 https://www.luogu.org/problemnew/show/P3157 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai&g ...
- P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)
P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...
- [Luogu P3157][CQOI2011]动态逆序对 (树套树)
题面 传送门:[CQOI2011]动态逆序对 Solution 一开始我看到pty巨神写这套题的时候,第一眼还以为是个SB题:这不直接开倒车线段树统计就完成了吗? 然后冷静思考了一分钟,猛然发现单纯的 ...
- luogu P3157 [CQOI2011]动态逆序对(CDQ分治)
题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...
- Luogu P3157 [CQOI2011]动态逆序对
题目链接 \(Click\) \(Here\) 这个题有点卡常数..我的常数比较大所以是吸着氧气跑过去的... 题意:计算对于序列中每个位置\(p\),\([1,p-1]\)区间内比它大的数的个数,和 ...
随机推荐
- 最近公共祖先(LCA)基础模板(倍增法)
之前在澡堂学过这么个东西,听课时理解非常透彻,然后做题时是这种状态: 因为并没有切板子题,最近切掉以后看同桌,他默默地说了一句话: 我是什么时候A的来着... 我当时就心态爆炸... 现在来进行简单整 ...
- HTML连载46-浮动元素字围现象、浮动练习
一.浮动元素的字围现象 div{ float:left; width:100px; height:100px; background-color: red; border:1px solid blac ...
- MySQL中使用group_concat遇到的坑
在使用group_concat的过程中遇到个问题,这里记录一下:在MySQL中有个配置参数group_concat_max_len,它会限制使用group_concat返回的最大字符串长度,默认是10 ...
- body标签添加ontouchstart属性
之前看别人的代码,发现他的body标签添加ontouchstart属性.即 <body ontouchstart> 上网查了一下原因,记录一下: 这个操作是进行手机端兼容处理的,防止伪类: ...
- MongoDB for OPS 01:服务介绍与基本使用
写在前面的话 数据库产品已经学习了两个,MySQL 和 Redis.接下来开始研究另外一款 NoSQL 产品 MongoDB,注意跟芒果没啥关系.该产品对于运维来说,相对于操作少一些. 关于 Mong ...
- 转caffe scale layer
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u011681952/article/det ...
- WeakHashMap,源码解读
概述 WeakHashMap也是Map接口的一个实现类,它与HashMap相似,也是一个哈希表,存储key-value pair,而且也是非线程安全的.不过WeakHashMap并没有引入红黑树来尽量 ...
- Python 爬取猫眼电影《无名之辈》并对其进行数据分析
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 罗昭成 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- selenium设置user-agent以及对于是否是浏览器内核进行反爬
(Session info: chrome=75.0.3770.90),不同版本方法可能会有些不同 推荐查资料网站必应可以避开一堆广告 一.user-agent设置 from selenium imp ...
- crm-1
1.crm 客户关系管理系统 :1.业务逻辑部分 2.权限插件 2.forms组件之modelform modelform就是model+form ,form根据model的字段生成标签 ,校验信息 ...