[模板] CDQ分治&&BZOJ3262:陌上花开
简介
CDQ分治是分治的一种, 可以看做归并排序的扩展, 利用离线将一些 \(O(n)\) 的暴力优化到 \(O(log n)\).
它可以用来顶替一些高级(log)数据结构等.
一般地, CDQ分治分为三部分:
- 递归左右区间
- 统计左区间对右区间的贡献
- 合并整个区间
或者:
- 递归左右区间
- 分别合并左, 右区间
- 统计左区间对右区间的贡献
这两种方法一般来说是等价的.
详见代码.
代码
利用cdq分治求三维偏序.
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
#define rep(i,l,r) for(register int i=(l);i<=(r);++i)
#define repdo(i,l,r) for(register int i=(l);i>=(r);--i)
#define il inline
typedef double db;
typedef long long ll;
//---------------------------------------
const int nsz=1e5+5,ksz=2e5+5;
int n0,n=0,k,ans[nsz];
struct tl{int a,b,c,cnt,res;}line[nsz]{{-1,-1,-1,0,0}};
bool cmpa(tl a,tl b){return a.a!=b.a?a.a<b.a:a.b!=b.b?a.b<b.b:a.c<b.c;}
bool cmpb(tl a,tl b){return a.b!=b.b?a.b<b.b:a.c<b.c;}
bool eq(tl a,tl b){return a.a==b.a&&a.b==b.b&&a.c==b.c;}
//bit
int bit[ksz];
#define lb(p) ((p)&(-(p)))
void add(int p,int v){while(p<=k)bit[p]+=v,p+=lb(p);}
int qu(int p){
int res=0;
while(p)res+=bit[p],p-=lb(p);
return res;
}
//第一种方式
tl l2[nsz];
void cdq(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
cdq(l,mid);
cdq(mid+1,r);
int pl=l,pr=mid+1;
rep(i,l,r){
if(pl<=mid&&(pr==r+1||line[pl].b<=line[pr].b)) //important: <=
add(line[pl].c,line[pl].cnt),l2[i]=line[pl++];
else
line[pr].res+=qu(line[pr].c),l2[i]=line[pr++];
}
rep(i,l,mid)add(line[i].c,-line[i].cnt);
rep(i,l,r)line[i]=l2[i];
}
//第二种方式
void cdq1(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
cdq1(l,mid);
cdq1(mid+1,r);
sort(line+l,line+mid+1,cmpb);
sort(line+mid+1,line+r+1,cmpb);
int p=l;
rep(i,mid+1,r){
while(line[p].b<=line[i].b&&p<=mid)add(line[p].c,line[p].cnt),++p;//important: <=
line[i].res+=qu(line[i].c);
}
rep(i,l,p-1)add(line[i].c,-line[i].cnt);
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n0>>k;
rep(i,1,n0)cin>>line[i].a>>line[i].b>>line[i].c;
sort(line+1,line+n0+1,cmpa);
rep(i,1,n0){
if(!eq(line[i],line[n]))line[++n]=line[i];
++line[n].cnt;
}
cdq(1,n);
// rep(i,1,n)printf("%d %d %d %d %d\n",line[i].a,line[i].b,line[i].c,line[i].cnt,line[i].res);
rep(i,1,n)ans[line[i].res+line[i].cnt-1]+=line[i].cnt;
rep(i,0,n0-1)cout<<ans[i]<<'\n';
return 0;
}
[模板] CDQ分治&&BZOJ3262:陌上花开的更多相关文章
- BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)
题目链接 BZOJ3262 洛谷P3810 /* 5904kb 872ms 对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会..) */ #inclu ...
- bryce1010专题训练——CDQ分治
Bryce1010模板 CDQ分治 1.与普通分治的区别 普通分治中,每一个子问题只解决它本身(可以说是封闭的) 分治中,对于划分出来的两个子问题,前一个子问题用来解决后一个子问题而不是它本身 2.试 ...
- 【BZOJ3262】陌上花开(CDQ分治)
[BZOJ3262]陌上花开(CDQ分治) 题解 原来放过这道题目,题面在这里 树套树的做法也请点上面 这回用CDQ分治做的 其实也很简单, 对于第一维排序之后 显然只有前面的对后面的才会产生贡献 那 ...
- 【BZOJ3262】陌上花开 cdq分治
[BZOJ3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义 ...
- 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1439 Solved: 648[Submit][Status][Discuss ...
- bzoj3262陌上花开 cdq分治
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2794 Solved: 1250[Submit][Status][Discus ...
- bzoj3262 陌上花开 cdq分治(入门)
题目传送门 思路:cdq分治处理偏序关系的模板题,主要就是学cdq分治吧,还在入门中. 代码其实也很好理解,记得树状数组操作的上限是 z的最大值,不是n的最大值,这个细节wa了好久. #include ...
- BZOJ3262 陌上花开 —— 三维偏序 CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3262 3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit ...
- bzoj3262陌上花开 cdq分治入门题
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
随机推荐
- react 阻止事件冒泡
前言 在学习react阻止事件冒泡,需要先了解 合成事件 和 原生事件 合成事件:在jsx中直接绑定的事件,就是合成事件: 原生事件: 通过js原生代码绑定的事件,就是原生事件: react事件:re ...
- iOS----------随机色
#define KColorRandomColor [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 ...
- 红米手机4A怎么样刷入开发版获得ROOT权限
小米的手机或平板不同手机型号一般情况官方都提供两个不同系统,可分为稳定版和开发版,稳定版没有提供root权限管理,开发版中就支持了root权限,在很多工作的时候我们需要使用的一些功能强大的app,都需 ...
- 或许,挂掉的点总是出人意料(hw其实蛮有好感的公司)
1:问了有没有考研的打算,为什么: ` 实验室指导自己的两个学长, 他们两个都是不考研党派,当然两个学长本科都进入了不错的公司hw,xm,耳濡目染就自己也就不想去考研了: 跟一些已经工作的程序员聊天, ...
- Windows Server 2016-查询并导出固定时间段创建AD用户
生产环境中往往我们有各式各样的需求,例如快速查询某段时间创建用户,或批量导出固定时间段创建用户列表,具体操作如下: $date=Get-Date $oldday=(Get-Date).AddDays( ...
- Linux IO 模型
Linux 中主要有五种IO模式:阻塞IO, 非阻塞IO, IO 多路复用,信号驱动IO和异步IO; 如果从同步非同步,阻塞非阻塞角度来看,又可以分为:同步阻塞IO, 同步非阻塞IO,异步阻塞IO和异 ...
- Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization(一)
接着上一篇,现在明确问题:在汇编克隆搜索文献中,有四种类型的克隆[15][16][17]:Type1.literally identical(字面相同):Type2.syntactically equ ...
- 初学python列表
首先我定义了一个列表 a = [2,3,3,5,6,7,9] 我想对列表a 的每个值都加一,哈,脑子里顿时闪过一道光 ①首先我想到的是用for 循环来进行加一,即以下代码 a = [2,3,3,5,6 ...
- RabbitMQ广播:direct模式
一. 消息的广播需要exchange:exchange是一个转发器,其实把消息发给RabbitMQ里的exchange fanout: 所有bind到此exchange的queue都可以接收消息,广播 ...
- 爬虫系列---scrapy全栈数据爬取框架(Crawlspider)
一 简介 crawlspider 是Spider的一个子类,除了继承spider的功能特性外,还派生了自己更加强大的功能. LinkExtractors链接提取器,Rule规则解析器. 二 强大的链接 ...