[bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解
原题
定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值。每比一个点大就为加一等级,求每个等级的点的数量。
显然的三维偏序问题,CDQ的板子题。
CDQ分治:
CDQ分治是一种特殊的分治方法,在 OI 界初见于陈丹琦 2008 年的集训队作业中,因此被称为 CDQ 分治。
CDQ分治是将操作分治,用于解决“修改独立,允许离线”的问题。本质为按时间分治。
可以用CDQ的题目必须满足:
1、修改与询问互相独立,且修改之间互不影响
2、允许离线
那么我们将操作序列分为两半。显然,后一半的操作不会对前一半产生影响,后一半的询问只受前一半操作和后一半在询问前的操作的影响。这看起来像是可以递归,因为后一半操作序列的修改操作完全不会影响前一半操作序列中的询问结果,因此前一半操作序列的查询实际是与后一半操作序列完全独立的,是与原问题完全相同的子问题,可以递归处理。
至此,一个动态修改题变为无动态修改操作的问题,设“解决无动态修改操作的原问题”的复杂度为O(f(n)),那么由主定理,我们知道这样分治的总时间复杂度将是O(f(n)logn)。
本题题解 && CDQ分治的一般思路:
1、sort处理一个维度
2、CDQ分治过程中归并一个维度
3、树状数组第三个维度计算答案
本题即为如此(树状数组维护前缀和,每次query即为答案,因为是按小到大顺序加入的)。
#include<cstdio>
#include<algorithm>
#define N 100010
#define M 200010
using namespace std;
struct hhh
{
int x,y,z,cnt,sum;
inline bool operator == (const hhh &b) const
{
return x==b.x && y==b.y && z==b.z;
}
inline bool operator < (const hhh &b) const
{
if (x!=b.x) return x<b.x;
if (y!=b.y) return y<b.y;
return z<b.z;
}
inline bool operator > (const hhh &b) const
{
if (y!=b.y) return y<b.y;
return z<=b.z;
}
}t[N],a[N];
int m,head,tail,ans[N],n,s,f[M];
int read()
{
int ans=0,fu=1;
char j=getchar();
for (;j<'0' || j>'9';j=getchar()) if (j=='-') fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
}
void init(int x)
{
while (x<=s)
{
if (f[x]) f[x]=0;
else break;
x+=x&-x;
}
}
int query(int x)
{
int ans=0;
while (x)
{
ans+=f[x];
x-=x&-x;
}
return ans;
}
void insert(int x,int y)
{
while (x<=s)
{
f[x]+=y;
x+=x&-x;
}
}
void CDQ(int l,int r)
{
if (l==r) return ;
int mid=(l+r)>>1,idx1=l,idx2=mid+1;
CDQ(l,mid);
CDQ(mid+1,r);
for (int i=l;i<=r;i++)
{
if (idx2>r || idx1<=mid && a[idx1]>a[idx2])
{
t[i]=a[idx1++];
insert(t[i].z,t[i].cnt);
}
else
{
t[i]=a[idx2++];
t[i].sum+=query(t[i].z);
}
}
for (int i=l;i<=r;i++)
{
a[i]=t[i];
init(a[i].z);
}
}
int main()
{
m=read();
s=read();
for (int i=1;i<=m;i++)
{
t[i].x=read();
t[i].y=read();
t[i].z=read();
}
sort(t+1,t+m+1);
head=1;
n=0;
while (head<=m)
{
tail=head+1;
while (tail<=m && t[tail]==t[head]) ++tail;
a[++n]=t[head];
a[n].cnt=tail-head;
head=tail;
}
CDQ(1,n);
for (int i=1;i<=n;i++)
ans[a[i].sum+a[i].cnt-1]+=a[i].cnt;
for (int i=0;i<m;i++)
printf("%d\n",ans[i]);
return 0;
}
[bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解的更多相关文章
- BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...
- 【算法学习】【洛谷】cdq分治 & P3810 三维偏序
cdq是何许人也?请参看这篇:https://wenku.baidu.com/view/3b913556fd0a79563d1e7245.html. 在这篇论文中,cdq提出了对修改/询问型问题(Mo ...
- 洛谷P3810 陌上花开(CDQ分治)
洛谷P3810 陌上花开 传送门 题解: CDQ分治模板题. 一维排序,二维归并,三维树状数组. 核心思想是分治,即计算左边区间对右边区间的影响. 代码如下: #include <bits/st ...
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- BZOJ3262:陌上花开 & 洛谷3810:三维偏序——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3262 https://www.luogu.org/problemnew/show/3810 Desc ...
- P3810 -三维偏序(陌上花开)cdq-分治
P3810 [模板]三维偏序(陌上花开) 思路 :按照 1维排序 二维 分治三维树状数组维护 #include<bits/stdc++.h> using namespace std; #d ...
- 洛谷P3810 陌上花开 (cdq)
最近才学了cdq,所以用cdq写的代码(这道题也是cdq的模板题) 这道题是个三维偏序问题,先对第一维排序,然后去掉重复的,然后cdq分治即可. 为什么要去掉重复的呢?因为相同的元素互相之间都能贡献, ...
- BZOJ 2716/2648 SJY摆棋子 (三维偏序CDQ+树状数组)
题目大意: 洛谷传送门 这明明是一道KD-Tree,CDQ分治是TLE的做法 化简式子,$|x1-x2|-|y1-y2|=(x1+y1)-(x2+y2)$ 而$CDQ$分治只能解决$x1 \leq x ...
- BZOJ3262陌上花开(三维偏序问题(CDQ分治+树状数组))+CDQ分治基本思想
emmmm我能怎么说呢 CDQ分治显然我没法写一篇完整的优秀的博客,因为我自己还不是很明白... 因为这玩意的思想实在是太短了: fateice如是说道: 如果说对于一道题目的离线操作,假设有n个操作 ...
随机推荐
- HTTP:地址栏输入url到显示页面的步骤
在浏览器地址栏输入URL 浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤 如果资源未缓存,发起新请求 如果已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证. 检验 ...
- Win10上Anaconda环境下python3.6安装和使用pyinstaller
一.安装步骤 1. 电脑是win10,安装的Python3.6 2. 在Scripts文件夹下执行pip install pyinstaller, 安装成功后下载pyinstaller安装包,解压之后 ...
- MySQL5.6基于MHA方式高可用搭建
master 10.205.22.185 #MHA node slave1 10.205.22.186 #MHA node+MHA manager slave2 10.205.22.187 #MH ...
- centos 7忘记了root密码,如何改密码?
今天服务器突然进不去了,不知道是密码被改了,还是什么情况! 服务器版本:centos 7.0 网上查找了很多文档,有些办法不可行,如果是亲自试过绝对可行的方法: 1:重启服务器,如下界面,按键盘 &q ...
- Docker学习之镜像操作
使用Docker镜像 以下都是Docker镜像的一系列重要名操作,包括获取.查看.搜索.删除.创建.存出或载入.上传等.可使用docker image help命令查看帮助. 1.获取镜像(pull) ...
- nop 插件解析
在计算领域,插件( plug-in or plugin)是将特定的功能增加到大型软件中的软件组件. nopCommerce插件用来扩展nopCommerce的功能.nopCommerce 有几种插件. ...
- Lucene实战
导包
- sql语句(Oracle和sqlserver)
查询表的首句:(Oracle) select * from (select a.*, rownum as rn from tab_name a order by col )where rn = 1 o ...
- vbox+Vagrant 入门指南
Vagrant 简介 Vagrant 是一个用来构建和管理虚拟机环境的工具.Vagrant 有着易于使用的工作流,并且专注于自动化,降低了开发者搭建环境的时间,提高了生产力.解决了"在我的机 ...
- B1008 数组元素循环右移问题 (20分)
B1008 数组元素循环右移问题 (20分) 思路 1 2 3 4 5 6 5 6 1 2 3 4 6个数,循环右移2位. 也可以理解为 先翻转 6 5 4 3 2 1 然后再两部分,分别翻转 5 6 ...