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< ...
随机推荐
- Python-爬虫-HTTP协议请求之GET请求
我们在百度搜索时,输入关键词,比如“hello”,URL发生变化,如下: https://www.baidu.com/s?wd=hello&rsv_spt=1&rsv_iqid=0xf ...
- Dll注入技术之APC注入
APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的,其具体流程如下: 1)当EXE里某个线程执行到SleepEx( ...
- jvm-多线程
多线程的目的 为什么要使用多线程?可以简单的分两个方面来说: 在多个cpu核心下,多线程的好处是显而易见的,不然多个cpu核心只跑一个线程其他的核心就都浪费了: 即便不考虑多核心,在单核下,多线程也是 ...
- 利用DOM节点找对象和直接在标签属性中调函数传值this的书写区别
同样的功能,不同的书写格式. 1.个人觉得比较繁琐的写法,但是比较常见,特别是在大项目的时候常用的就是这种方法: <div id="mouse" onmouseover=&q ...
- 13-MySQL-Ubuntu-数据表的查询-条件查询(二)
条件查询 1,比较查询(>,<,>=,<=,=)注:SQL查询语句的等于号(=) (1)查询学生表中年龄大于18岁的学生姓名和性别信息 select name,gender f ...
- 字符串KMP算法
讲解:http://blog.csdn.net/starstar1992/article/details/54913261 #include <bits/stdc++.h> using n ...
- 使用Photoshop+960 Grid System模板进行网页设计
前几天彬Go和大家一起讨论了960 Grid System这个CSS网格系统框架的基本原理和使用方法.今天,暴风彬彬将教大家使用Photoshop结合960 Grid System模板来设计一个真正符 ...
- iOS开发系列-打印内存地址
打印内存地址 基本数据类型 定义一个基本数据类型,会根据变量类型分配对应的内存空间.比如定义一个int类型的变量a. int a = 10; 内存如下 输入变量a在内存中内存地址 NSLog(@&qu ...
- docker ps -a
1 pwd 2 mkdir data 3 ll 4 uname -n 5 cd data/ 6 ll 7 pwd 8 ll 9 wget -N --no-check-certificate https ...
- Android 开发 框架系列 OkHttp拦截器
前言 此篇博客只讲解okhttp的拦截器功能的详细使用,如果你还不太了解okhttp可以参考我另外一篇博客 Android 开发 框架系列 OkHttp使用详解 添加Interceptor的简单例子 ...