洛谷 P3157 [CQOI2011]动态逆序对 解题报告
P3157 [CQOI2011]动态逆序对
题目描述
对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数。给\(1\)到\(n\)的一个排列,按照某种顺序依次删除\(m\)个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。
输入输出格式
输入格式:
输入第一行包含两个整数\(n\)和\(m\),即初始元素的个数和删除的元素个数。以下\(n\)行每行包含一个\(1\)到\(n\)之间的正整数,即初始排列。以下\(m\)行每行一个正整数,依次为每次删除的元素。
输出格式:
输出包含\(m\)行,依次为删除每个元素之前,逆序对的个数。
说明
\(N\le 100000,M\le 50000\)
万年以前树套树怎么都是60pts,今天终于决定进行CDQ分治水过去。
每个元素安排三个属性为\(P_i,A_i,D_i\)分别代表在原序列的位置,元素值和被删时间。
然后我们统计一下\(P_i < P_j,A_i>A_j,D_i<D_j\)的个数。
然后我调了半个多小时...
终于弄明白\(P_i > P_j,A_i<A_j,D_i<D_j\)也要统计...
Code:
#include <cstdio>
#include <algorithm>
#define ll long long
const int N=1e5+10;
struct node{int a,b,p;}sq[N];
int n,m,s[N];
ll ans[N];
void add(int x,int d){while(x<=m)s[x]+=d,x+=x&-x;}
int ask(int x){int sum=0;while(x)sum+=s[x],x-=x&-x;return sum;}
bool cmp1(node n1,node n2){return n1.a>n2.a;}
bool cmp2(node n1,node n2){return n1.a<n2.a;}
void CDQ(int l,int r)
{
if(l==r) return;
int mid=l+r>>1;
CDQ(l,mid),CDQ(mid+1,r);
std::sort(sq+l,sq+r+1,cmp1);
for(int i=l;i<=r;i++)
{
if(sq[i].p<=mid) add(sq[i].b,1);
else ans[sq[i].b]+=1ll*(ask(m)-ask(sq[i].b-1));
}
for(int i=l;i<=r;i++) if(sq[i].p<=mid) add(sq[i].b,-1);
std::sort(sq+l,sq+r+1,cmp2);
for(int i=l;i<=r;i++)
{
if(sq[i].p>mid) add(sq[i].b,1);
else ans[sq[i].b]+=1ll*(ask(m)-ask(sq[i].b-1));
}
for(int i=l;i<=r;i++) if(sq[i].p>mid) add(sq[i].b,-1);
}
int main()
{
scanf("%d%d",&n,&m);
for(int a,i=1;i<=n;i++)
{
scanf("%d",&a);
sq[a].a=i;
sq[a].b=m;
sq[a].p=a;
}
for(int a,i=1;i<=m;i++)
{
scanf("%d",&a);
sq[a].b=i;
}
CDQ(1,n);
ans[m]>>=1;
for(int i=m-1;i;i--) ans[i]+=ans[i+1];
for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
return 0;
}
2018.11.27
洛谷 P3157 [CQOI2011]动态逆序对 解题报告的更多相关文章
- 洛谷 P3157 [CQOI2011]动态逆序对(树套树)
题面 luogu 题解 树套树(树状数组套动态开点线段树) 静态使用树状数组求逆序对就不多说了 用线段树代替树状数组,外面套树状数组统计每个点逆序对数量 设 \(t1[i]\)为\(i\)前面有多少个 ...
- 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治
题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...
- 洛谷P3157 [CQOI2011]动态逆序对
题目大意: 给定\(1\)到\(n\)的一个排列,按照给定顺序依次删除\(m\)个元素,计算每个元素删除之前整个序列的逆序对数量 基本套路:删边变加边 那么我们不就是求满足\(pos_i<pos ...
- 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]动态逆序对(CDQ 分治)
传送门 解题思路 cdq分治,将位置看做一维,修改时间看做一维,权值看做一维,然后就转化成了三维偏序,用排序+cdq+树状数组.注意算删除贡献时要做两次cdq,分别算对前面和后面的贡献. #inclu ...
随机推荐
- 两个字段联合约束(mysql)
联合约束:ALTER TABLE `lywl_provider_package` ADD unique(providerId,packCode) 给一个表建唯一约束
- 使用Python的Requests库进行web接口测试
1.Requests简介Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提 ...
- HDU 6438
Problem Description The Power Cube is used as a stash of Exotic Power. There are n cities numbered 1 ...
- java之接口开发-初级篇-socket通信
socket通信实现util包类实现 public class SocketThread extends Thread { public void run() { while (true) { // ...
- scikit-learn使用PCA降维小结
本文在主成分分析(PCA)原理总结和用scikit-learn学习主成分分析(PCA)的内容基础上做了一些笔记和补充,强调了我认为重要的部分,其中一些细节不再赘述. Jupiter notebook版 ...
- 无人驾驶技术之Kalman Filter原理介绍
基本思想 以K-1时刻的最优估计Xk-1为准,预测K时刻的状态变量Xk/k-1,同时又对该状态进行观测,得到观测变量Zk,再在预测与观之间进行分析,或者说是以观测量对预测量进行修正,从而得到K时刻的最 ...
- 创建image
摘要: 本节演示如何通过 Web GUI 和 CLI 两种方法创建 Image. 本节演示如何通过 Web GUI 和 CLI 两种方法创建 Image. OpenStack 为终端用户提供了 Web ...
- Action Required: Please provide your Tax Identity Information - Amazon Seller Tax Identity Collection
Hello ***, Your selling privileges have been suspended because we have not received required tax i ...
- eBay推Winit海外仓 鼓励卖家拓展北美市场
[亿邦动力网讯]2月11日消息,日前,跨境电商平台eBay与外贸电商服务商万邑通(Winit)合作,针对平台卖家推出了Winit美国海外仓,鼓励卖家拓展北美市场. 亿邦动力网获悉,Winit美国海外仓 ...
- centos7.2下解决用Mysql 使用navicate远程连接数据库出现1045 access denied for user 'root'@'localhost' using password yes
在mysql命令行中执行 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456'); GRANT ALL PRIVILEGES ON *.* ...