[模板] 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要美丽,当 ...
随机推荐
- 使用Canvas绘制简单的时钟控件
Canvas是HTML5新增的组件,它就像一块幕布,可以用JavaScript在上面绘制各种图表.动画等. 没有Canvas的年代,绘图只能借助Flash插件实现,页面不得不用JavaScript和F ...
- WebStorm 配置微信小程序开发 用html样式打开wxml 用css样式打开wxss 配置微信小程序提醒
1.点开preferences 2.搜索找到“File Types” 3.找到"HTML",点击“+”按钮,添加“*.wxml”然后“apply” 4.和3一样,再找到 ‘casc ...
- 01-html介绍和head标签
[转]01-html介绍和head标签 主要内容 web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 HTML规范 HTML结构详解 一.web标准 web准备介绍: w3c:万维网 ...
- Oracle11g: datetime
--上一月,上一年 select add_months(sysdate,-1) last_month,add_months(sysdate,-12) last_year from dual; --下一 ...
- wepy框架自定义组件编译报错not Found File XXX.wxss
今天在自己写wepy框架组件的时候编译后报错not Found File XXX.wxss 我去,当时我很难受啊,调用组件时结构和逻辑都正常,一写样式就原地爆炸 解决之路:1.先打开编译后的dist文 ...
- MyCat | 分库分表实践
引言 先给大家介绍2个概念:数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式. 切分模式 一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之 ...
- docker 学习资料收集
Docker中文网 http://www.docker.org.cn/book/ docker镜像怎么迁移到其他的服务器 http://www.talkwithtrend.com/Question/1 ...
- linux下的QT打包方法
一句话很简单,一个shell脚本搞定,不跟你嘻嘻哈哈 #!/bin/shexe="ThorIceLocker"#存放你的可执行文件的名字des="/home/ninetr ...
- [20190416]11g下那些latch是Exclusive的.txt
[20190416]11g下那些latch是Exclusive的.txt --//昨天测试了11g下那些latch是共享的,链接:--//是否反过来剩下的都是Exclusive的.继续测试: 1.环境 ...
- 常用SMTP地址
1.QQ邮箱(mail.qq.com) POP3服务器地址:pop.qq.com(端口:110) SMTP服务器地址:smtp.qq.com(端口:25) 2.搜狐邮箱(sohu.com): POP3 ...