洛谷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]\)区间内比它大的数的个数,和 ...
随机推荐
- ssm-restful风格
码云 https://gitee.com/MarkPolaris/ssm-test02
- 基于Django的Rest Framework框架的分页组件
本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和下一页,速度快) 回到目录 一 简单分 ...
- 序列化禁止使用Optional
1: 概论 Optional 是Java8用来改变java引发NPE的解决办法,但是不是绝对的解决办法 2: 例子: 很多博文一上来就给力以下使用例子 @Data public class User ...
- 明解C语言 入门篇 第八章答案
练习8-1 #include<stdio.h> #define diff(x,y)(x-y) int main() { int x; int y; printf("x=" ...
- oidc hybrid flow 与另外两种模式的异同
很多学习identityserver的文章都没有解释清楚oidc hybrid混合模式的含义.本文将解释hybrid模式与另外两种模式的主要区别. 我们先看一下一手文档: https://openid ...
- KeContextToKframes函数逆向
在逆向_KiRaiseException(之后紧接着就是派发KiDispatchException)函数时,遇到一个 KeContextToKframes 函数,表面意思将CONTEXT转换为 TRA ...
- MySQL 中的字符串类型
字符类型包括: CHAR VARCHAR BINARY VARBINARY BLOB TEXT ENUM SET CHAR 与 VARCHAR CHAR(m) m 取值范围 0-255.列宽固定,存储 ...
- 动态SQL屏幕条件选择(里面还有赋值的新语法)
有时候屏幕条件中使用PARAMETERS时候,如果你为空的话,会查不出数据,但是可能你的想法是不想限制而已,但是系统默认理解为了空值,这个时候,如果取判断一下条件是不是空,在SQL里决定写不写的话,会 ...
- C# delegate multicast single delegate
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serializatio ...
- 骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 小詹&有乔木 PS:如有需要Python学习资料的小伙伴可 ...