bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)
Description
Input
Output
Sample Input
1
5
3
4
2
5
1
4
2
Sample Output
2
2
1
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std; int n,m,l,r,o,p,num=;
long long ans=;
inline int read(){
p=;o=getchar();
while(o<''||o>'') o=getchar();
while(o>=''&&o<='') p=p*+o-,o=getchar();
return p;
}
int root[],a[],tt[];
struct tree{
int l,r,k;
tree(){
k=;
}
};
tree t[];
inline void insert(int &p,int l,int r,int k){
if (p==) p=++num;
t[p].k++;
if (l==r) return;
int mid=l+r>>;
if (k<=mid) insert(t[p].l,l,mid,k);else insert(t[p].r,mid+,r,k);
}
inline void del(int p,int l,int r,int k){
t[p].k--;
if (l==r) return;
int mid=l+r>>;
if (k<=mid) del(t[p].l,l,mid,k);else del(t[p].r,mid+,r,k);
}
inline int qui(int p,int l,int r,int k){
if (p==) return ;
if (r==k) return t[p].k;
int mid=l+r>>;
if (k<=mid) return qui(t[p].l,l,mid,k);else return qui(t[p].r,mid+,r,k)+(t[p].l==?:t[t[p].l].k);
}
inline int qua(int p,int l,int r,int k){
if (p==) return ;
if (l==k) return t[p].k;
int mid=l+r>>;
if (k<=mid) return qua(t[p].l,l,mid,k)+(t[p].r==?:t[t[p].r].k);else return qua(t[p].r,mid+,r,k);
}
inline int lo(int x){return x&(-x);}
inline void in(int i,int k){
while(i<=n){
insert(root[i],,n,k);
i+=lo(i);
}
}
inline void de(int i,int k){
while(i<=n){
del(root[i],,n,k);
i+=lo(i);
}
}
inline long long ask(int x,int k){
long long s=;
k++;
while(x>){
if (k<=n) s+=qua(root[x],,n,k);
x-=lo(x);
}
return s;
}
inline long long aski(int x,int k){
long long s=;
k--;
while(x>){
if (k>=) s+=qui(root[x],,n,k);
x-=lo(x);
}
return s;
}
int main(){
register int i,j;
n=read();
m=read();
for (i=;i<=n;i++) in(i,a[i]=read()),tt[a[i]]=i;
for (i=;i<=n;i++) ans+=ask(i,a[i]);
while(m--){
printf("%lld\n",ans);
l=read();r=tt[l];
if (a[r]==) continue;a[r]=;
ans-=ask(r,l)+aski(n,l)-aski(r,l);
de(r,l);
}
}
CDQ分治
#include<cstdio>
#include<algorithm>
using namespace std;
int read_p,read_ca,pr_num,pr_ch[];
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
inline void pr(long long k){
pr_num=;
while(k>) pr_ch[++pr_num]=k%,k/=;
while(pr_num)
putchar(pr_ch[pr_num--]+);
putchar('\n');
}
struct na{
int x,y,t;
}b[],o[],y[];
int n,m,u[],ti[],s[];
long long ans[][];
inline int low(int x){return x&(-x);} inline void add(int x){
while (x<=n){
s[x]++;
x+=low(x);
}
}
inline void del(int x){
while (x<=n){
s[x]--;
x+=low(x);
}
}
inline int ask(int x){
int ans=;
while (x>){
ans+=s[x];
x-=low(x);
}
return ans;
}
inline bool cmp(na a,na b){
if ((a.x==b.x)&&(a.y==b.y)) return a.t<b.t;
if (a.x==b.x) return a.y>b.y;
return a.x<b.x;
}
inline bool tmp(na a,na b){
if ((a.x==b.x)&&(a.y==b.y)) return a.t<b.t;
if (a.x==b.x) return a.y<b.y;
return a.x>b.x;
}
inline void work0(int l,int r){
if (l==r) return;
int mid=l+r>>,ll=l-,rr=mid;
for (register int i=l;i<=r;i++){
if (b[i].t<=mid) add(n-b[i].y+);
if (b[i].t>mid) ans[b[i].t][]+=ask(n-b[i].y+);
}
for (register int i=l;i<=r;i++)
if (b[i].t<=mid) o[++ll]=b[i];else o[++rr]=b[i];
for (register int i=l;i<=r;i++) b[i]=o[i];
for (register int i=l;i<=r;i++) if (b[i].t<=mid) del(n-b[i].y+);
work0(l,mid);work0(mid+,r);
}
inline void work1(int l,int r){
if (l==r) return;
int mid=l+r>>,ll=l-,rr=mid;
for (register int i=l;i<=r;i++){
if (y[i].t<=mid) add(y[i].y);
if (y[i].t>mid) ans[y[i].t][]+=ask(y[i].y);
}
for (register int i=l;i<=r;i++) if (y[i].t<=mid) del(y[i].y);
for (register int i=l;i<=r;i++)
if (y[i].t<=mid) o[++ll]=y[i];else o[++rr]=y[i];
for (register int i=l;i<=r;i++) y[i]=o[i];
work1(l,mid);work1(mid+,r);
}
int main(){
register int i,j=;
n=read();m=read();
for (i=;i<=n;i++) u[read()]=i;
for (i=;i<m;i++) ti[read()]=m-i;
for (i=;i<=n;i++){
if (ti[i]==) b[i].t=++j;else b[i].t=n-m+ti[i];
b[i].x=u[i];b[i].y=i;
y[i]=b[i];
}
sort(b+,b+n+,cmp);
sort(y+,y+n+,tmp);
work0(,n);work1(,n);
for (int i=;i<=n;i++) ans[i][]+=ans[i-][],ans[i][]+=ans[i-][];
for (int i=n;i>j;i--) pr(ans[i][]+ans[i][]);
}
bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)的更多相关文章
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- bzoj 3295 [Cqoi2011]动态逆序对(cdq分治,BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3295 [题意] n个元素依次删除m个元素,求删除元素之前序列有多少个逆序对. [思路] ...
- 【刷题】BZOJ 3295 [Cqoi2011]动态逆序对
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]
RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...
- BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)
题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数 ...
- BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治
时间.位置.数字为三个属性. 排序时间,CDQ位置,树状数组处理数字即可. #include <cstdio> #include <cstring> #include < ...
- 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)
[题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...
- 【BZOJ】3295: [Cqoi2011]动态逆序对
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3295 mamaya,弱鸡xrdog终于会写树套树啦.... 将树状数组中每一个节点看成一棵 ...
随机推荐
- ReactNative 基础学习
安卓Back键的处理·基本+高级篇 http://bbs.reactnative.cn/topic/480/%E5%AE%89%E5%8D%93back%E9%94%AE%E7%9A%84%E5%A4 ...
- Python图片爬虫
1.今天给大家介绍自己写的一个图片爬虫,说白了就是从网页自动上下载需要的图片 2.首先选取目标为:http://www.zhangzishi.cc/涨姿势这个网站如下图,我们的目标就是爬取该网站福利社 ...
- flask入门篇
flask,Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . Flask简单易学,属于轻量级的,学起来 ...
- vue有关小知识
截取链接参数: //截取链接参数 this.id = this.$route.query.id;
- vue基础学习(一)
01-01 vue使用雏形 <div id="box"> {{msg}} </div> <script> window.onload= func ...
- @NotEmpty、@NotBlank、@NotNull的区别
@NotEmpty 用在集合类上面 @NotBlank 用在String上面 @NotNull 用在基本类型上 只有简单的结果,但是再更具体一点的内容就搜不到了,所以去看了看源码,发现了如下的注释 ...
- Logback分别打印info日志和error日志
<?xml version="1.0" encoding="utf-8" ?><configuration> <appender ...
- MarkDown的用法
# 一级标题## 二级标题### 三级标题#### 四级标题##### 五级标题###### 六级标题# 无序标题- 文本- 文本- 文本# 有序标题1. 文本2. 文本3. 文本# 图片链接[张驰博 ...
- Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python)
Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python) 前提是已经安装了python2,python3 1)安装各种依赖库 sudo apt-get update ...
- css自适应
一.顶部标题自适应 <html> <head> <title>顶部标题</title> <style> body{padding:0;mar ...