【CQOI2011】动态逆序对

分析
近乎裸的 \(cdq\) 分治数点问题
我们考虑一个数被删去,它对删后区间逆序对个数的影响就是减去现存序列中前面比它大的个数再减去现存序列中后面比它小的个数
那么我们考虑如何处理时间限制
既然是“现存序列中”,也就是说删去时间比它晚的
那么能产生贡献的数对 \((i,j)\) 就要满足 \(i < j,val_i > val_j,time_i > time_j\)
这是前面的贡献
而后面的贡献同理,所以我们在每轮分治中算左区间对右区间的贡献以及右区间对左区间的贡献
注意:删后还没删完的若干个数我们让它们的删去时间依次递增
因为没删完的数可以相互贡献,但我们不能重复算同一个数对
所以我们让时间递增,然后取严格大于来算贡献
\(Code\)
#include<cstdio>
#include<algorithm>
#define LL long long
using namespace std;
const int N = 1e5 + 5;
int n , m , rd[N] , ans[N] , c[N] , up;
struct node{
int a , b , id;
}f[N];
inline bool cmp(node x , node y){return x.a > y.a;}
inline int lowbit(int x){return x & (-x);}
inline void add(int x , int v){for(; x <= up; x += lowbit(x)) c[x] += v;}
inline int query(int x)
{
int res = 0;
for(; x; x -= lowbit(x)) res += c[x];
return res;
}
inline void solve(int l , int r)
{
if (l == r) return;
int mid = (l + r) >> 1;
solve(l , mid) , solve(mid + 1 , r);
sort(f + l , f + mid + 1 , cmp) , sort(f + mid + 1 , f + r + 1 , cmp);
int j = l;
for(register int i = mid + 1; i <= r; i++)
{
while (f[j].a > f[i].a && j <= mid) add(f[j].b , 1) , j++;
ans[f[i].id] += query(up) - query(f[i].b);
}
for(register int i = l; i < j; i++) add(f[i].b , -1);
j = r;
for(register int i = mid; i >= l; i--)
{
while (f[j].a < f[i].a && j >= mid + 1) add(f[j].b , 1) , j--;
ans[f[i].id] += query(up) - query(f[i].b);
}
for(register int i = j + 1; i <= r; i++) add(f[i].b , -1);
}
int main()
{
scanf("%d%d" , &n , &m);
for(register int i = 1; i <= n; i++) scanf("%d" , &f[i].a) , rd[f[i].a] = f[i].id = i;
int x;
for(register int i = 1; i <= m; i++) scanf("%d" , &x) , f[rd[x]].b = i;
up = m;
for(register int i = 1; i <= n; i++)
if (!f[i].b) f[i].b = ++up; else rd[f[i].b] = i;
solve(1 , n);
LL res = 0;
for(register int i = 1; i <= n; i++) res += (LL)ans[i];
for(register int i = 1; i <= m; i++) printf("%lld\n" , res) , res -= (LL)ans[rd[i]];
}
【CQOI2011】动态逆序对的更多相关文章
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- bzoj3295[Cqoi2011]动态逆序对 树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5987 Solved: 2080[Submit][Sta ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- P3157 [CQOI2011]动态逆序对
P3157 [CQOI2011]动态逆序对 https://www.luogu.org/problemnew/show/P3157 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai&g ...
- 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)
3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...
- BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7465 Solved: 2662[Submit][Sta ...
- 洛谷 P3157 [CQOI2011]动态逆序对 解题报告
P3157 [CQOI2011]动态逆序对 题目描述 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n ...
随机推荐
- Python: 你所不知道的星号 * 用法
以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/FHyosiG_tegF5NRUEs7UdA 本文大概 1193 个 ...
- ssm 乱码
1.post乱码:在web.xml中增加解决解决post乱码的过滤器 <!--解决POST乱码问题--> <filter> <filter-name>Charact ...
- 第2-4-8章 规则引擎Drools实战(1)-个人所得税计算器
目录 9. Drools实战 9.1 个人所得税计算器 9.1.1 名词解释 9.1.2 计算规则 9.1.2.1 新税制主要有哪些变化? 9.1.2.2 资较高人员本次个税较少,可能到年底扣税增加? ...
- Blender修改视野范围
首先,我不是专门的建模人员.但是有时候会拿到建模人员的制作的模型导入进行修改. 比如简单的删除某个模型,调整模型的尺寸. 还有就是调整模型的建模中心点,这点有时候显得特别重要,模型的中心点偏离较大会给 ...
- js day04 实参与形参个数不一致
// function fn(x, y) { // // x = 1 // // y = undefined // // 1 + ...
- 【算法总结】【队列均LinkedList】栈和队列、双端队列的使用及案例
1.栈 初始化:Stack<E> stack = new Stack<>(); 出栈:stack.pop() 或 stack.remove(stack.size() - 1) ...
- Service层
package com.neu.service; import java.util.List; import com.neu.bean.User;import com.neu.dao.UserDao; ...
- python多线程批量操作交换机
import time import socket import threading def device_info(): ip_list = [] name_list = [] user_list ...
- JavaScript:变量:如何声明变量?
声明变量可以用下面几种方式: 但是这几种声明方式肯定是有区别的,主要是上面三种方式的区别,这需要结合window对象和作用域来说明,这里不赘述. 声明变量的时候,推荐使用let,这是ES6新推出的更好 ...
- (6)go-micro微服务consul配置、注册中心
目录 一 Consul介绍 1. 注册中心Consul基本介绍 2.注册中心Consul关键功能 3.注册中心Consul两个重要协议 二 Consul安装 1.使用docker拉取镜像 三 Conf ...