/*
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 树套树 )的更多相关文章

  1. 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治

    [BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...

  2. bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组

    [bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...

  3. [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...

  4. BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 1 ...

  5. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)

    3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...

  6. 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)

    3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...

  7. P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...

  8. 【bzoj3295】[Cqoi2011]动态逆序对

    题目描述: 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆 ...

  9. 【bzoj3295】[Cqoi2011]动态逆序对 线段树套SBT

    题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...

随机推荐

  1. 在vue中路径中的@

    1.在Vue的路径中@等于src 2.在css的路径中~@等于src

  2. 负载均衡之LVS的三种模式

    模式一:D-NAT模式 原理:此模式类似NAT网络中,所以此网络内主机发到互联网上的数据包的源目的IP都是NAT路由的IP,在NAT路由上做了IP替换. 把客户端发来的数据的IP头的目的地址在负载均衡 ...

  3. 从零搭建Pytorch模型教程(四)编写训练过程--参数解析

    ​  前言 训练过程主要是指编写train.py文件,其中包括参数的解析.训练日志的配置.设置随机数种子.classdataset的初始化.网络的初始化.学习率的设置.损失函数的设置.优化方式的设置. ...

  4. Linux 运行升讯威在线客服系统:同时支持 SQL Server 和 MySQL 的实现方法

    前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程. 有很多朋友一直提出希望能够支持 MySQL 数据库,考虑到已经有朋友在用 SQL Server,我在升级的过程中 ...

  5. 拒绝蛮力,高效查看Linux日志文件!

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 日常分析问题时,会频繁地查看分析日志,但如果蛮力去查看日志,耗时费力还不一定有效果,因此我总结了在Linux常用的 ...

  6. 《HelloGitHub》第 75 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  7. go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)

    在前几篇的文章中,我们花了很大的篇幅介绍如何利用缓存优化系统的读性能,究其原因在于我们的产品大多是一个读多写少的场景,尤其是在产品的初期,可能多数的用户只是过来查看商品,真正下单的用户非常少.但随着业 ...

  8. 校验日期格式为yyyy-MM-dd

    /** * 校验时间 * * @param text * @return */ public static boolean checkTime(String text) { DateFormat fo ...

  9. 5.RDD操作综合实例

    一.词频统计 A. 分步骤实现 1.准备文件 (1)下载小说或长篇新闻稿 (2)上传到hdfs上 2.读文件创建RDD 3.分词 4. ·排除大小写lower(),map() ·标点符号re.spli ...

  10. C语言求100以内的和的4种方式

    C语言的一个很经典的例子,帮助熟练运行几个循环的写法 * 方法一(do---while语句) #include main () { int i,sum=0; do { sum=sum+i; i++; ...