洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治
题目:https://www.luogu.org/problemnew/show/3157
题解:
1.对于静态的逆序对可以用树状数组做
2.我们为了方便可以把删除当成增加,可以化动为静
3.找到三维:时间,位置,大小
然后CDQ分治
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 200010
typedef long long ll;
using namespace std;
ll n,m,ans[N],a[N],t[N];
struct point
{
ll t,pos,val;
bool operator < (const point &x)const
{return val>x.val;}
}p[N],tmp[N];
bool cmp(const point &x,const point &y)
{return x.t<y.t;}
void add(int x,int k)
{
for (;x<N;x+=x&-x) t[x]+=k;
}
ll query(int x)
{
ll ret=0;
for (;x;x-=x&-x) ret+=t[x];
return ret;
}
void solve(int l,int r)
{
if (l==r) return ;
int mid=l+r>>1,i=l,j=mid+1;
solve(l,mid),solve(mid+1,r);
for (int k=l;k<=r;k++)
if (i<=mid && (p[i]<p[j] || j>r))
tmp[k]=p[i++];
else tmp[k]=p[j++];
for (i=l;i<=r;i++)
{
p[i]=tmp[i];
if (p[i].t<=mid) add(p[i].pos,1);
else ans[p[i].t]+=query(p[i].pos);
}
for (i=l;i<=r;i++)
if (p[i].t<=mid) add(p[i].pos,-1);
for (i=r;i>=l;i--)
if (p[i].t<=mid) add(p[i].pos,1);
else ans[p[i].t]+=query(n)-query(p[i].pos);
for (i=l;i<=r;i++)
if (p[i].t<=mid) add(p[i].pos,-1); }
int main()
{
scanf("%lld%lld",&n,&m);
for (int i=1,x;i<=n;i++)
scanf("%lld",&x),p[x].val=x,p[x].pos=i;
for (int i=0,x;i<m;i++)
scanf("%lld",&x),p[x].t=n-i;
for (int i=1,cnt=0;i<=n;i++)
if (!p[i].t) p[i].t=++cnt;
sort(p+1,p+n+1,cmp);
solve(1,n);
for(int i=1;i<=n;i++)
ans[i]+=ans[i-1];
for(int i=n;i>=n-m+1;i--)
printf("%lld\n",ans[i]);
return 0;
}
洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治的更多相关文章
- 洛谷 P3157 [CQOI2011]动态逆序对 解题报告
P3157 [CQOI2011]动态逆序对 题目描述 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n ...
- 洛谷 P3157 [CQOI2011]动态逆序对(树套树)
题面 luogu 题解 树套树(树状数组套动态开点线段树) 静态使用树状数组求逆序对就不多说了 用线段树代替树状数组,外面套树状数组统计每个点逆序对数量 设 \(t1[i]\)为\(i\)前面有多少个 ...
- 洛谷P3157 [CQOI2011]动态逆序对
题目大意: 给定\(1\)到\(n\)的一个排列,按照给定顺序依次删除\(m\)个元素,计算每个元素删除之前整个序列的逆序对数量 基本套路:删边变加边 那么我们不就是求满足\(pos_i<pos ...
- P3157 [CQOI2011]动态逆序对 CDQ分治
一道CDQ分治模板题简单来说,这道题是三维数点对于离线的二维数点,我们再熟悉不过:利用坐标的单调递增性,先按更坐标排序,再按纵坐标排序更新和查询时都直接调用纵坐标.实际上,我们是通过排序将二维中的一维 ...
- LUOGU P3157 [CQOI2011]动态逆序对(CDQ 分治)
传送门 解题思路 cdq分治,将位置看做一维,修改时间看做一维,权值看做一维,然后就转化成了三维偏序,用排序+cdq+树状数组.注意算删除贡献时要做两次cdq,分别算对前面和后面的贡献. #inclu ...
- P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)
P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 1 ...
随机推荐
- Java打印金字塔问题
Java打印金字塔问题 public class 金字塔问题 { // //普通金字塔 // public static void main(String[] args) { // //先打印4层 / ...
- AWS CentOS7 实例修改主机名
问题描述: AWS EC2 实例在升级到CentOS7以后,我们发现主机名的修改不再像之前的版本(CentOS 5/6)一样简单. 每次新建实例之后,修改好主机名,重启或者克隆之后的机器,主机名还是会 ...
- springMVC入门二
一.准备工作 参考springMVC入门一,搭建maven项目如下: 前台结构如下: 项目介绍:使用springMVC实现前后台数据交互,例如controller返回json,页面传入pojo 二.具 ...
- 《Redis设计与实现》- AOF持久化
1. AOF持久化 Redis AOF 持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的. 2. RDB持久化与AOF持久化的区别 RDB持久化 RDB持久化通过保存数据中的键值对来记 ...
- Python__for循环和列表生成式的区别
话不多,上例子 >>> L = [,,] >>> for i in range(len(L)): L[i] = L[i] + L[i-] print(L) #结果 ...
- python 获取类中除内置方法外的所有方法名
#!/usr/bin/env python# !-*- coding:utf-8 -*- class Menu: def __init__(self): pass def updateProject( ...
- 430. Flatten a Multilevel Doubly Linked List
/* // Definition for a Node. class Node { public: int val = NULL; Node* prev = NULL; Node* next = NU ...
- python——“/”运算符和“//”运算符的区别
首先先看单斜杆的用法:举几个例子 >>> print(5/3),type(5/3)1.6666666666666667(None, <class 'float'>) &g ...
- python-9-IO编程
1-文件读写 f = open('d:/file.txt','r') #如果文件不存在会报异常 print(f.read()) #一次性读取所有内容 f.close() 1.2 由于文件操作会用异常, ...
- Python 文本挖掘:使用情感词典进行情感分析(算法及程序设计)
出处:http://www.ithao123.cn/content-242299.html 情感分析就是分析一句话说得是很主观还是客观描述,分析这句话表达的是积极的情绪还是消极的情绪. 原理 比如 ...