BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治
时间、位置、数字为三个属性。
排序时间,CDQ位置,树状数组处理数字即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define maxn 100005
int a[maxn],q[maxn],n,m,pos[maxn],del[maxn];
struct Event{
int t;//时间
int x;//加入的数
int y;//加入的位置
}b[maxn];
struct Bit_Tree{
int x[maxn];
void add(int i,int f)
{
for (;i<maxn;i+=i&(-i)) x[i]+=f;
}
int gs(int i)
{
int ret=0;
for (;i;i-=i&(-i)) ret+=x[i];
return ret;
}
}BT; bool cmp1(Event a,Event b) {return a.t<b.t;} bool cmp2(Event a,Event b) {return a.y<b.y;} bool cmp3(Event a,Event b) {return a.y>b.y;} ll ans[maxn]; void CDQ(int l,int r,int flag)
{
if (l==r) return ;
int mid=l+r>>1;
CDQ(l,mid,flag); CDQ(mid+1,r,flag);
int pl=l;
if (flag) F(i,mid+1,r)
{
while (b[pl].y<b[i].y&&pl<=mid) BT.add(b[pl++].x,1);
int tmp=BT.gs(n)-BT.gs(b[i].x-1);
ans[b[i].t]+=tmp;
}
else F(i,mid+1,r)
{
while (b[pl].y>b[i].y&&pl<=mid) BT.add(b[pl++].x,1);
int tmp=BT.gs(b[i].x-1);
ans[b[i].t]+=tmp;
}
F(i,l,pl-1) BT.add(b[i].x,-1);
sort(b+l,b+r+1,flag?cmp2:cmp3);
} int main()
{
scanf("%d%d",&n,&m);
F(i,1,n) scanf("%d",&a[i]),pos[a[i]]=i;
F(i,1,m)
{
scanf("%d",&q[i]);
del[q[i]]=1;
b[i].t=n-i+1;
b[i].x=q[i];
b[i].y=pos[q[i]];
}
int now=m;
F(i,1,n)
if (!del[i])
{
b[++now].t=n-now+1;
b[now].x=i;
b[now].y=pos[i];
}
sort(b+1,b+n+1,cmp1);
CDQ(1,n,1);
sort(b+1,b+n+1,cmp1);
CDQ(1,n,0);
F(i,2,n) ans[i]+=ans[i-1];
D(i,n,n-m+1) printf("%lld\n",ans[i]);
}
BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治的更多相关文章
- BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]
RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...
- 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个元素,你的任务是在每次删除一个元素之前统计 ...
随机推荐
- 【extjs6学习笔记】0.1 准备:基础概念 (01)
1. Ext.application 应用程序入口点 2. Ext.onReady() 页面加载完成后触发动作 3. Ext.define() 4. Ext.data.proxy.Proxy 5. E ...
- Java MVC 分页实例
共4个文件 requestLogList.jsp RequestInfoController.java RequestInfoBean.java RequestInfoService.java 1.r ...
- 使用Azure CDN更快速的交付内容
WEB加速服务是最基本也是应用最广泛的CDN加速服务,主要针对html文件,CSS,图片,JS,flash动画等更新频率低的小文件加速.通过将这些小文件缓存到Azure CDN的边缘节点,减少源站的访 ...
- 允许Java App(applet)粘贴方法
修改安全策略文件: "java.policy" JRE6的路径在:"C:\Program Files (x86)\Java\jre6\lib\security" ...
- servlet上传多个文件(乱码解决)
首先,建议将编码设置为GB2312,并在WEB-INF\lib里导入:commons-fileupload-1.3.jar和commons-io-2.4.jar, 可百度下下载,然后你编码完成后,上传 ...
- js常用技巧汇总
将彻底屏蔽鼠标右键 oncontextmenu="window.event.returnvalue=false" <table border oncontextmenu=re ...
- 控制器生命周期方法(LifeCycle)
1.init方法: 在init方法中实例化必要的对象(遵从LazyLoad思想) init方法中初始化ViewController本身 2.loadView方法: 当view需要被展示而它 ...
- EditorConfig文件
EditorConfig .editorconfig文件 在很多开源项目中,会出现这个文件,这个文件有何作用? editorconfig 帮助开发者的(编辑器和IDEs)定义和维护编程风格. 有些编辑 ...
- 简单css动画 fadeIn fadeOut flash
考虑兼容性采用 -webkit- -o- -mos- -ms- @keyframes fadeIn{ 0%{ opacity: 0; display: block; } 100%{ opacity: ...
- 几种优化web页面加载速度的策略
剥离静态资源请求到CDN 一般在主域名下的HTTP请求里都会携带大量Cookie信息,最大4KB,每个域名下最多50条:但如果仅仅访问js/css/jpeg等静态资源文件的话是不需要Cookie信息, ...