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< ...
随机推荐
- hdu多校第九场 1006 (hdu6685) Rikka with Coin 暴力
题意: 有一些1毛,2毛,5毛,1块的钢镚,还有一些价格不同的商品,现在要求你带一些钢镚,以保证这些商品中任选一件都能正好用这些钢镚付账,问最少带多少钢镚. 题解: 对于最优解,1毛的钢镚最多带1个, ...
- SetFileAttributes
设置文件属性: SetFileAttributes(文件名, 属性值) 读取文件属性:GetFileAttributes(文件名); 读取文件属性 SetFileAttributes(文件名, FIL ...
- python中面向对象
一.Python经典类与新类 经典类:如果没有直接或间接的子类化一个对象,也就是说如果没有指定一个父类,或者是如果子类化的基本类没有父类,那么就定义了经典类: class classics: 'def ...
- uoj74 【UR #6】破解密码
题目 发现这个题的本质就是在做\(\rm hash\) 我们显然能够列出\(n\)个方程,之后高消,这是\(O(n^3)\)的 但是观察一下第一个和第二个方程 \[a_{1}26^{n-1}+a_{2 ...
- centos7使用iptables作为防火墙方法
centos7使用iptables作为防火墙方法查看firewalld状态: systemctl status firewalld将centos7默认的firewalld停止,并将iptables作为 ...
- nginx 知识
nginx如何实现高并发? 启动nginx服务器后,输入 ps -ef |grep nginx,会发现nginx有一个master进程 和若干个worker进程, 这些worker进程是平等的,都是被 ...
- expect安装
expect是在tcl基础上创建起来的,因此在安装expect之前需要安装tcl 安装TCL下载地址:http://www.tcl.tk/software/tcltk/download.html[ro ...
- 数据库MySQL--基础查询
1.查询字段 查询表某字段:select 字段名 from 表名: 查询表内所有字段:select * from 表名: (当字段和关键字重名是用( ` )着重号区分 ) 2.查询常量值 select ...
- 十二. for of 示例 (可以解决大多数应用场景)
for of entries() 可以同时拿到数组的索引跟值 因此可以使用解构的语法: for of 示例 1. 求和 2.字符串
- 简单的 js手写轮播图
html: <div class="na1"> <div class="pp"> <div class="na ...