cdq分治(偏序)
偏序问题:
https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen
优质题目:
https://oi.men.ci/tag/cdq/
看思想:
https://www.cnblogs.com/MyNameIsPc/p/9297296.html
https://www.cnblogs.com/mlystdcall/p/6219421.html
三维偏序
维度a,b,c
[m+1,r]对于[l,m]满足条件的个数
经过排序过,
a:
[m+1,r]的任意一个数比[l,m]的任意一个数大
这一维解决了
b:
区间合并时是按照b从小到大添加的
这一维解决了
c:
树状数组记录
注意:
1.去掉相同的项
如果不那么做,如果[m+1,r]中的一项与[l,m]中的一项相同,就会出错。
2.[l,m]的数值添加到树状数组中,最后要去掉。
https://loj.ac/problem/112
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=1e5+;
const int inf=1e9;
const double eps=1e-;
const int maxf=2e5+; int maxv,f[maxf],sum[maxn]; struct node
{
int a,b,c,g,v;///排b,c这两个维度只是为了找到相同的(a,b,c),没有其它的意义
bool operator<(const node &y) const
{
if (a==y.a)
{
if (b==y.b)
return c<y.c;
return b<y.b;
}
return a<y.a;
}
}d[maxn],e[maxn]; void update(int x,int y)
{
while (x<=maxv)
{
f[x]+=y;
x+=x&-x;
}
} int cal(int x)
{
int sum=;
while (x)
{
sum+=f[x];
x-=x&-x;
}
return sum;
} void cdq(int l,int r)
{
int m=(l+r)>>;
if (l==r)
return;
cdq(l,m),cdq(m+,r);
int i,j,k;
for (i=l;i<=r;i++)
d[i]=e[i];
i=l,j=m+,k=l;
while (i<=m && j<=r)
{
if (d[i].b<=d[j].b)
update(d[i].c,d[i].g),e[k++]=d[i++];
else
d[j].v+=cal(d[j].c),e[k++]=d[j++];
}
while (i<=m)
update(d[i].c,d[i].g),e[k++]=d[i++];
while (j<=r)
d[j].v+=cal(d[j].c),e[k++]=d[j++];
for (i=l;i<=m;i++)
update(d[i].c,-d[i].g);
} int main()
{
int n,m,i;
scanf("%d%d",&n,&maxv);
for (i=;i<=n;i++)
scanf("%d%d%d",&d[i].a,&d[i].b,&d[i].c),d[i].g=;
sort(d+,d+n+);
e[]=d[],m=;
for (i=;i<=n;i++)
if (d[i].a==d[i-].a && d[i].b==d[i-].b && d[i].c==d[i-].c)
e[m].g++;
else
e[++m]=d[i];
cdq(,m);
for (i=;i<=m;i++)
sum[d[i].v+d[i].g-]+=d[i].g;
for (i=;i<n;i++)
printf("%d\n",sum[i]);
return ;
}
/*
3 100
1 1 1
2 2 2
3 3 3
*/
later
https://oi.men.ci/bzoj-2253/
「BZOJ 2253」纸箱堆叠 - CDQ 分治 + DP
cdq分治(偏序)的更多相关文章
- SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治
Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...
- COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]
传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的 ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- CDQ分治嵌套模板:多维偏序问题
CDQ分治2 CDQ套CDQ:四维偏序问题 题目来源:COGS 2479 偏序 #define LEFT 0 #define RIGHT 1 struct Node{int a,b,c,d,bg;}; ...
- N维偏序:cdq分治
cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- 浅谈CDQ分治与偏序问题
初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...
- P3810 【模板】三维偏序(陌上花开)(cdq分治)
思路 看到这种偏序类的题目,而且不要求强制在线,可以立刻想到cdq分治 注意这题有一个问题,就是询问的是小于等于而不是小于,如果相等的话两个元素会相互贡献,而cdq的特点是右区间不能对左边有影响,所以 ...
- cdq分治解决三维偏序
问题背景 在三维坐标系中有n个点,坐标为(xi,yi,zi). 定义一个点A比一个点B小,当且仅当xA<=xB,yA<=yB,zA<=zB.问对于每个点,有多少个点比它小.(n< ...
随机推荐
- flutter WebView flutter js 互调
通过webview 进行flutter 和js 的互调,页面可以放在其他网站 也可以放在本地,我这里放在本地进行测试. 1.引入webview_flutter: ^0.3.5+2 这个是官网推荐用的, ...
- jquery中typeof的用法
typeof 可以用来检测给定变量的数据类型,可能的返回值: 'undefined' 'boolean' 'string' 'number' 'object' 'function' var hahah ...
- 从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1)
从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1) 假设数据已经是排序好的 #include <stdio.h> #include & ...
- Win7+Ubuntu11.10(EasyBCD硬盘安装)----转载
Win7+Ubuntu11.10(EasyBCD硬盘安装) ubuntu 下载地址:http://mirrors.163.com/ubuntu-releases/12.04/ 1)首先还是分区,在计算 ...
- !!!myeclipse 上加载本地图片问题,无法加载问题
出现无法加载本地图片的问题, 原因就是把图片放到了本地项目中的image了,但是myeclipse上没有刷新 这样以后 本地的图片比在线的要快 低级错误,诶!
- springboot2.0整合springsecurity前后端分离进行自定义权限控制
在阅读本文之前可以先看看springsecurity的基本执行流程,下面我展示一些核心配置文件,后面给出完整的整合代码到git上面,有兴趣的小伙伴可以下载进行研究 使用maven工程构建项目,首先需要 ...
- php+jquery 上拉加载
<script type="text/javascript"> var resflow = true,pages =2; var ps=$("#ids&quo ...
- R语言 数据重塑
R语言数据重塑 R语言中的数据重塑是关于改变数据被组织成行和列的方式. 大多数时间R语言中的数据处理是通过将输入数据作为数据帧来完成的. 很容易从数据帧的行和列中提取数据,但是在某些情况下,我们需要的 ...
- (组合数学)不定方程的解+猜测——cf997B
首先要求出三种等价情况 5×1+1×50=1×5+5×105×1+1×50=1×5+5×10 9×5=5×1+4×10 8×5+1×50=9×10 那么可以求出三种关于x5,x10的不可行条件 x ...
- C++如何判断某一文件是否存在
函数名: access 功 能: 确定文件的访问权限 用 法: int access(const char *filename, int amode); 程序例: #include <stdio ...