偏序问题:

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分治(偏序)的更多相关文章

  1. SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治

    Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...

  2. COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]

    传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的 ...

  3. BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

  4. CDQ分治嵌套模板:多维偏序问题

    CDQ分治2 CDQ套CDQ:四维偏序问题 题目来源:COGS 2479 偏序 #define LEFT 0 #define RIGHT 1 struct Node{int a,b,c,d,bg;}; ...

  5. N维偏序:cdq分治

    cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...

  6. 洛谷P3810 陌上花开 CDQ分治(三维偏序)

    好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...

  7. 浅谈CDQ分治与偏序问题

    初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...

  8. P3810 【模板】三维偏序(陌上花开)(cdq分治)

    思路 看到这种偏序类的题目,而且不要求强制在线,可以立刻想到cdq分治 注意这题有一个问题,就是询问的是小于等于而不是小于,如果相等的话两个元素会相互贡献,而cdq的特点是右区间不能对左边有影响,所以 ...

  9. cdq分治解决三维偏序

    问题背景 在三维坐标系中有n个点,坐标为(xi,yi,zi). 定义一个点A比一个点B小,当且仅当xA<=xB,yA<=yB,zA<=zB.问对于每个点,有多少个点比它小.(n< ...

随机推荐

  1. 解决jqGrid中,当前页一直显示为0的问题

    项目中,经常会见到使用 jqGrid 进行一些数据的列表展示,而且使用起来也比较方便.但是有时会遇到一些奇怪的问题,比如前几天我就遇到了在使用 jqGrid 时,当前页一直显示为 0 的问题.下图就是 ...

  2. access数据库调用

    1.工程环境配置(vs+qt) 点击项目,右键,选择项目设置,选择SQL 2.获取自己数据库的驱动版本有哪些,如下代码所示: QStringList drivers = QSqlDatabase::d ...

  3. 2018北京网络赛 G The Mole /// 分块暴力 点线距离

    题目大意: 给定n段线段 编号为1~n 接下来m个询问 给定一点 输出离该点最近的线段的最小编号(距离相等时取编号小的) 题解 大致就是 1.坐标范围为(0,2^16-1) 将坐标系划分为2^8*2^ ...

  4. 【POJ】2240 Arbitrage

    题目链接:http://poj.org/problem?id=2240 题意:n种国家的货币,m个换算汇率.问你能不能赚钱. eg:1美元换0.5英镑,1英镑换10法郎,1法郎换0.21美元,这样1美 ...

  5. mysql 04_章基本查询

    当我们使用select查询语句向数据库发送一个查询请求,数据库会根据请求执行查询,并返回一个虚拟表,其数据来源于真实的数据表. 一.查询所有数据:所有的字段.所有的记录 格式:SELECT * FRO ...

  6. Spark RDD基本操作

  7. python中的OrderedDict

    该类型存放顺序和添加顺序一致,比如逐个赋值,但和dict直接转化过去的顺序不一定一样. d1 = collections.OrderedDict() d1['b'] = 'B'd1['a'] = 'A ...

  8. C++相对路径和绝对路径

    学习备忘 转自:http://www.cnblogs.com/vranger/p/3820783.html 电脑硬盘E盘下,建文件夹“test”,"test"下建立子文件夹“fil ...

  9. odoo 分组视图下显示同一批次记录的总数

    修改前: 修改后: xml文件: <?xml version="1.0" encoding="utf-8"?> <!-- vim:fdn=3: ...

  10. js 常见功能总会

    一.随着页面滚动,元素到达可视区域,显示特殊样式 <!DOCTYPE html> <html lang="en"> <head> <met ...