BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]
RT
首先可以看成倒着插入,求逆序对数
每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值
$CDQ(l,r)$时归并排序$x$
然后用$[l,mid]$的加入更新$[mid+1,r]$的查询(其实每个数就是一个插入一个查询)
这里就是前后求逆序对,用树状数组
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- typedef long long ll;
- const int N=2e5+;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,m;
- int mp[N];
- struct Operation{
- int t,x,y;
- Operation(){}
- Operation(int t,int id,int v):t(t),x(id),y(v){}
- bool operator <(const Operation &r)const{
- return x==r.x ? y<r.y : x<r.x;
- }
- }a[N],t[N];
- inline bool cmpTime(const Operation &a,const Operation &b){
- return a.t==b.t ? a.x<b.x : a.t<b.t;
- }
- int c[N];
- inline int lowbit(int x){return x&-x;}
- inline void add(int p,int v){for(;p<=n;p+=lowbit(p)) c[p]+=v;}
- inline int sum(int p){
- int re=;
- for(;p;p-=lowbit(p)) re+=c[p];
- return re;
- }
- ll ans[N];
- void CDQ(int l,int r){
- if(l==r) return;
- int mid=(l+r)>>;
- CDQ(l,mid);CDQ(mid+,r);
- int i=l,j=mid+,p=l;
- while(i<=mid||j<=r){
- if(j>r||(i<=mid&&a[i]<a[j])) add(a[i].y,),t[p++]=a[i++];
- else ans[a[j].t]+=sum(n)-sum(a[j].y),t[p++]=a[j++];
- }
- for(int i=l;i<=mid;i++) add(a[i].y,-);
- for(int i=l;i<=r;i++) a[i]=t[i];
- for(int i=r;i>=l;i--){
- if(a[i].t<=mid) add(a[i].y,);
- else ans[a[i].t]+=sum(a[i].y);
- }
- for(int i=l;i<=r;i++) if(a[i].t<=mid) add(a[i].y,-);
- }
- int main(){
- //freopen("inverse.in","r",stdin);
- //freopen("inverse.out","w",stdout);
- n=read();m=read();
- for(int i=;i<=n;i++) a[i]=Operation(,i,read()),mp[a[i].y]=i;
- int Tim=n;
- for(int i=;i<=m;i++) a[mp[read()]].t=Tim--;
- for(int i=;i<=n;i++) if(!a[i].t) a[i].t=Tim--;
- sort(a+,a++n,cmpTime);
- //for(int i=1;i<=10;i++) printf("hi %d %d %d\n",i,a[i].t,a[i].y);
- CDQ(,n);
- //for(int i=1;i<=10;i++) printf("ans %d %d\n",i,ans[i]);
- for(int i=;i<=n;i++) ans[i]+=ans[i-];
- for(int i=n;i>=n-m+;i--) printf("%lld\n",ans[i]);
- }
【update 2017-03-17】
前两天学到了删除的姿势,逆序对问题的删除操作不用时间倒流也可以,直接减去它形成的逆序对数并且在树状数组中删除就可以了
虽然慢一些但是清晰多了
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- typedef long long ll;
- const int N=2e5+;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,Q,a[N],pos[N],x;
- int m,tim;
- struct meow{
- int t,x,y,type,qid;
- meow(){}
- meow(int a,int b,int c,int d,int e=):t(a),x(b),y(c),type(d),qid(e){}
- bool operator <(const meow &r) const{
- return x==r.x ? y<r.y : x<r.x;
- }
- }q[N],t[N];
- ll ans[N];
- int c[N];
- inline void add(int p,int v) {for(;p<=n;p+=(p&-p)) c[p]+=v;}
- inline int sum(int p) {int re=; for(;p;p-=(p&-p)) re+=c[p]; return re;}
- void CDQ(int l,int r){
- if(l==r) return;
- int mid=(l+r)>>;
- for(int i=l;i<=r;i++){
- if(q[i].t<=mid) add(q[i].y,q[i].type);
- else ans[q[i].qid]+= q[i].type*( sum(n)-sum(q[i].y) );
- }
- for(int i=l;i<=r;i++) if(q[i].t<=mid) add(q[i].y,-q[i].type);
- for(int i=r;i>=l;i--){
- if(q[i].t<=mid) add(q[i].y,q[i].type);
- else ans[q[i].qid]+= q[i].type*sum(q[i].y-);
- }
- for(int i=l;i<=r;i++) if(q[i].t<=mid) add(q[i].y,-q[i].type);
- int p1=l,p2=mid+;
- for(int i=l;i<=r;i++){
- if(q[i].t<=mid) t[p1++]=q[i];
- else t[p2++]=q[i];
- }
- for(int i=l;i<=r;i++) q[i]=t[i];
- CDQ(l,mid); CDQ(mid+,r);
- }
- int main(){
- freopen("in","r",stdin);
- n=read(); Q=read();
- for(int i=;i<=n;i++) a[i]=read(), pos[a[i]]=i, q[++m]=meow(++tim, i, a[i], , );
- for(int i=;i<=Q;i++) x=read(), q[++m]=meow(++tim, pos[x], x, -, i);
- sort(q+, q++m);
- CDQ(,m);
- for(int i=;i<=Q;i++) ans[i]+=ans[i-],printf("%lld\n",ans[i-]);
- }
BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]的更多相关文章
- BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治
时间.位置.数字为三个属性. 排序时间,CDQ位置,树状数组处理数字即可. #include <cstdio> #include <cstring> #include < ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)
3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...
- BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 1 ...
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- bzoj 3295 [Cqoi2011]动态逆序对(cdq分治,BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3295 [题意] n个元素依次删除m个元素,求删除元素之前序列有多少个逆序对. [思路] ...
- bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
随机推荐
- Logger之Logger.getLogger(CLass)技巧代替system.out.print
---恢复内容开始--- 尊重原创:http://www.cnblogs.com/zxf330301/p/5876117.html 之前一直在使用System.out.println()来调试.但是用 ...
- Linux学习之XShell与虚拟机的连接
最近在慕课网上学习Linux视频,记录一下解决问题的方法和过程. 实验软件环境: 虚拟机软件Vmware Workstation10.0.虚拟机系统CentOS 6.3(32位).XShell 5.0 ...
- 调用webService的几种方式
转自:http://blog.csdn.net/u011165335/article/details/51345224 一.概览 方式1: HttpClient:可以用来调用webservie服务,也 ...
- 使用setTimeout实现setInterval
setInterval = () =>{ console.log(1) //使用递归 setTimeout(setInterval,1000); }; setInterval()
- 如何动态修改网页的标题(title)?
有时候我们需要复用一个页面,但是又希望他们拥有各自的标题,这时候就需要动态的去更改页面的title了,不然所有页面都是一个标题. 这时候就会想到使用js或jQuery去实现了. 1.js方式. 首先, ...
- css3渐变之线性渐变
css3定义了两种类型的渐变,即线性渐变和径向渐变.这里我要说的是线性渐变. 为了创建一个线性渐变,你必须至少定义两种颜色结点.颜色结点即你想要呈现平稳过渡的颜色.同时,你也可以设置一个起点和一个方向 ...
- AMD规范学习笔记
背景 NodeJS的一套比较简洁 Moudles 规范, 使得在服务器端的模块化变得更加简单.很长一段时间,很多公司或者项目都有自己的一套模块化机制, 却未能形成一套统一的标准, NodeJS的Mou ...
- ECharts插件的使用
ECharts插件:官网下载echarts.js开发者可以选择源码.下载地址:http://echarts.baidu.com/download.html 下载之后,echarts.js放在js文件夹 ...
- CSS3 background-size图片自适应
http://www.html5cn.com.cn/css3/2013-04-21/267.html background-size属性和background-origin属性.background- ...
- Asp.net Core 跨域配置
一般情况WebApi都是跨域请求,没有设置跨域一般会报以下错误 No 'Access-Control-Allow-Origin' header is present on the requested ...