BZOJ3295/Luogu3157 [CQOI2011]动态逆序对 (CDQ or 树套树 )
/*
Dear friend, wanna learn CDQ?
As a surprice, this code is totally wrong.
You may ask, then why you put it on your blog, are you fucking crazy with the fans, isn't it clear you do not have one.
Well, I just found a anime picture in other's blog.
I love it, so I wanna put it on my blog, but, if I waste time for a picture, I'll feel that I'm a shame.jpg!.
So I cheated to myself that I just use this picture to decorate my code.
Good reason, isn't it.
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define R(a,b,c) for(register int a = (b); a <= (c); ++ (a))
#define nR(a,b,c) for(register int a = (b); a >= (c); -- (a))
#define ll long long
#define Min(a,b) ((a) < (b) ? (a) : (b))
#define Max(a,b) ((a) > (b) ? (a) : (b))
#define ON_DEBUG
#ifdef ON_DEBUG
#define D_e_Line printf("\n\n---------------------\n\n");
#else
#define D_e_Line ;
#endif
struct ios{
template<typename ATP>ios& operator >> (ATP &x){
x = 0; int f = 1; char c;
for(c = getchar(); c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
while(c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c = getchar();
x *= f;
return *this;
}
}io;
using namespace std;
const int N = 100007;
int n,m;
int tim;
struct Element{
int a,b,c;
long long ans;
bool operator< (const Element &com)const{
if(a != com.a) return a < com.a;
if(b != com.b) return b > com.b;
return c < com.c;
}
}a[N],tmp[N];
long long t[N];
inline void Updata(int x, int w){
for(; x <= tim; x += x&-x) t[x] += w;
}
inline long long Query(int x){
long long s = 0;
for(; x; x -= x&-x) s += t[x];
return s;
}
inline void CDQ(int l,int r){
if(l == r) return;
int mid = (l + r) >> 1;
CDQ(l, mid), CDQ(mid + 1, r);
int i = l, j = mid + 1, k = l;
while(i <= mid && j <= r){
if(a[i].b >= a[j].b){
Updata(a[i].c, 1);
tmp[k++] = a[i++];
}
else{
a[j].ans += Query(a[j].c);
tmp[k++] = a[j++];
}
}
while(j <= r) a[j].ans += Query(a[j].c), tmp[k++] = a[j++];
R(j, l, i - 1) Updata(a[j].c, -1);
while(i <= mid) tmp[k++] = a[i++];
R(i,l,r) a[i] = tmp[i];
}
long long tot[N];
int main(){
io >> n >> m;
tim = 1;
R(i,1,n){
io >> a[i].b;
a[i].a = i;
a[i].c = tim;
}
R(i,1,m){
int x;
io >> x;
a[x].c = ++tim;
}
sort(a + 1, a + n + 1);
CDQ(1, n);
R(i,1,n){
tot[a[i].c] += a[i].ans;
//cout<<"$$"<<a[i].ans<<endl;
}
R(i,2,tim){
printf("%lld\n", tot[i]);
}
return 0;
}

Another way is to use BIT to work with segment tree of value.
#define lson t[rt].l, l, mid
#define rson t[rt].r, mid + 1, r
struct SegmentTree{
int l,r;
int siz;
}t[N*100];
int treeIndex;
inline void Pushup(int &rt){//pointer, pointer, once again! pointer!!!!@!$#$!@%$!@%!@^!$#&*$(&
t[rt].siz = t[t[rt].l].siz + t[t[rt].r].siz;
}
inline void SegModify(int &rt,int l,int r,int x,int val){//be careful, rt is a pointer for rt[]
if(!rt) rt = ++treeIndex;
if(l == r){
t[rt].siz += val;
return;
}
int mid = (l + r) >> 1;
if(x <= mid)
SegModify(lson, x, val);
else
SegModify(rson, x, val);
Pushup(rt);
}
inline int SegQuery(int rt,int l,int r,int L,int R){
if(!rt || L > R) return 0;
if(L <= l && r <= R) return t[rt].siz;
int mid = (l + r) >> 1, sum = 0;
if(L <= mid) sum += SegQuery(lson, L, R);
if(R > mid) sum += SegQuery(rson, L, R);
return sum;
}
int rt[N];
inline void Updata(int x,int w,int val){
for(; x <= n; x += x&-x) SegModify(rt[x], 1, n, w, val);
}
inline int Query(int x,int w){
int s = 0;
for(; x; x -= x&-x) s += SegQuery(rt[x], 1, n, 1, w);
return s;
}
int pos[N];
int a[N];
int main(){
// freopen("IN.txt","r",stdin);
// freopen("OUT.txt","w",stdout);
int m;
io >> n >> m;
R(i,1,n){
io >> a[i];
Updata(i, a[i], 1);
pos[a[i]] = i;
}
long long ans = 0;
R(i,1,n){
ans += Query(i - 1, n) - Query(i - 1, a[i]);//QAQ
}
while(m--){
int x;
io >> x;
printf("%lld\n", ans);
ans -= Query(pos[x] - 1, n) - Query(pos[x] - 1, x) + Query(n, x - 1) - Query(pos[x], x - 1);//QTAQ
Updata(pos[x], x, -1);
}
return 0;
}
BZOJ3295/Luogu3157 [CQOI2011]动态逆序对 (CDQ or 树套树 )的更多相关文章
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 1 ...
- bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)
3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...
- 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)
3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...
- P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)
P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...
- 【bzoj3295】[Cqoi2011]动态逆序对
题目描述: 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆 ...
- 【bzoj3295】[Cqoi2011]动态逆序对 线段树套SBT
题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...
随机推荐
- MySQL中读页缓冲区buffer pool
Buffer pool 我们都知道我们读取页面是需要将其从磁盘中读到内存中,然后等待CPU对数据进行处理.我们直到从磁盘中读取数据到内存的过程是十分慢的,所以我们读取的页面需要将其缓存起来,所以MyS ...
- 16岁男生信息竞赛成瘾心理出现问题 妈妈:他竟说要AK我
16岁男生信息竞赛成瘾心理出现问题 -- 妈妈:他竟说要AK我 "我儿子最近快走火入魔了,医生,你救救他吧."40出头的林女士拉着儿子走进江苏省人民医院临床心理科.近几年,信息竞赛 ...
- 【物联网天线选择攻略】2.4GHz 频段增益天线模块设备选择
天线模块设备(antenna)是一种能量变换器,它把传输线上传播的导行波,变换成在无界媒介中传播的电磁波,或者进行相反的变换.对于设计一个应用于射频系统中的小功率.短距离的2.4GHz无线收发设备, ...
- 左右手切换工具xmouse v1.2版本发布
Xmouse 方便的切换鼠标左右键,因为功能非常简单,所以支持.net framework 2.0及以上 windows环境就可以了,目前已测试win7.win10可用. 关于为什么做这么个东西,那是 ...
- SAP Html viewer
1 *&---------------------------------------------------------------------* 2 *& Report RSDEM ...
- ansible环境安装及数据恢复
配置免密登录服务器及下载备份文件#!/bin/bash BACKUP=192.168.30.233 #一行写一个IP BACKUP_PASSWD="lxzl_root*#2021" ...
- UiPath选择器之页面选择器的介绍和使用
一.页面选择器的介绍 某些软件程序的布局和属性节点具有易变的值,例如某些Web应用程序.UiPath Studio无法预测这些变化,因此,您可能必须手动生成一些选择器. 每个属性都有一个分配的值.选择 ...
- RPA应用场景-公积金贷款业务数据整合和报送
场景概述 公积金贷款业务数据整合和报送 所涉系统名称 个贷系统.公积金管理系统 人工操作(时间/次) 0.5小时 所涉人工数量1000操作频率 每日 场景流程 1.机器人整理个人贷款信息.个人贷款账户 ...
- .Net之延迟队列
介绍 具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费. 使用场景 延时队列在项目中的应用还是比较多的,尤其像电商类平台: 订单成功后,在30分钟内 ...
- ClickHouse(03)ClickHouse怎么安装和部署
本文会介绍如何安装和部署ClickHouse,官方推荐的几种安装模式,以及安装之后如何启动,ClickHouse集群如何配置等. 简单来说,ClickHouse的搭建流程如下: 环境检查,环境依赖安装 ...