打开CDQ的大门&BZOJ3262
第一次接触CDQ分治,感谢YZ大佬的教导。
CDQ分治就是一种奇特的分治方法,它用左区间的区间信息来更新右区间。
设CDQ(L,R,l,r)表示递归到区间[L,R],区间的值为[l,r]。
mid=l+r/2。
将L~R区间按<=mid和>mid的两块重新分开。
继续递归区间分治。
CDQ分治用于解决一类偏序问题,题目中所求的为三维偏序。
即计算一类ai<bi,aj<bj,ak<bk的贡献。
普通的二维偏序大家都做过,经典题目逆序对。
三维怎么做呢?
第一维依然是SORT,第三位是树状数组。
第二维是CDQ。
第一维SORT后有序,故无需考虑第一维。
第二维CDQ分治时枚举L~R区间,当a[i].y>mid时,计算在权值树状数组上的贡献,否则插入树状数组。
注意:这道题需要对重复区间判重,否则贡献值不好算。
code:
/**************************************************************
Problem: 3262
User: yekehe
Language: C++
Result: Accepted
Time:1116 ms
Memory:10600 kb
****************************************************************/
#include <cstdio>
#include <algorithm>
using namespace std;
char tc()
{
static char tr[],*A=tr,*B=tr;
return A==B&&(B=(A=tr)+fread(tr,,,stdin),A==B)?EOF:*A++;
}
int read()
{
char c;while(c=tc(),c<''||c>'');
int x=c-'';while(c=tc(),c>=''&&c<='')x=x*+c-'';
return x;
}
struct node{
int x,y,z,o;
}a[],lx[],rx[],Ne[];
int N,K,cnt;
int at[],b[],tim,ans[],tot[];
inline int cmp(node x,node y){return x.x<y.x || x.x==y.x&&x.y<y.y || x.x==y.x&&x.y==y.y&&x.z<y.z;}
void add(int x,int y)
{
for(int i=x;i<=K;i+=i&-i){
if(b[i]!=tim)at[i]=,b[i]=tim;
at[i]+=y;
}
return ;
}
int get(int x)
{
int tot=;
for(int i=x;i;i-=i&-i)
if(!(b[i]^tim))tot+=at[i];
return tot;
}
void cdq(int L,int R,int l,int r)
{
tim++;
int mid=l+r>>,lt=,rt=;
for(int i=L;i<=R;i++){
if(!(l^r)){
ans[Ne[i].o]+=get(Ne[i].z);
add(Ne[i].z,tot[Ne[i].o]);
}
else{
if(Ne[i].y<=mid)add(Ne[i].z,tot[Ne[i].o]);
else ans[Ne[i].o]+=get(Ne[i].z);
}
}//统计贡献
for(int i=L;i<=R;i++){
if(Ne[i].y<=mid)lx[++lt]=Ne[i];
else rx[++rt]=Ne[i];
}
for(int i=;i<=lt;i++)Ne[L+i-]=lx[i];
for(int i=;i<=rt;i++)Ne[L+i-+lt]=rx[i];//类似于归并那样重组
if(!(l^r))return ;
cdq(L,L+lt-,l,mid);
cdq(L+lt,R,mid+,r);
return ;
}
int IS(int x,int y){
return a[x].x==a[y].x&&a[x].y==a[y].y&&a[x].z==a[y].z;
}
int res[];
int main()
{
N=read(),K=read();
for(int i=;i<=N;i++){
a[i].x=read(),a[i].y=read(),a[i].z=read();
}
sort(a+,a+N+,cmp);
a[].x=a[].y=a[].z=-2e9;
for(int i=;i<=N;i++){
if(IS(i,i-))++tot[cnt];
else tot[++cnt]=,Ne[cnt]=a[i],Ne[cnt].o=cnt;
}//去重
cdq(,cnt,,K);//注意为cnt
for(int i=;i<=cnt;i++)res[ans[i]+tot[i]-]+=tot[i];
for(int i=;i<N;i++)printf("%d\n",res[i]);
return ;
}
打开CDQ的大门&BZOJ3262的更多相关文章
- 文科生打开python的大门
作为唯一的一名教育学院的学生,加入python课程,一定要声明我可不是并不是被迫选课的!虽然是文科生,但是是对编程这种东西很感兴趣的文科生.从站在python门口的张望,到现在悄悄把门打开,越来越感觉 ...
- 第一步,怎么打开react的大门?
前言 其实我的react的实战经验很少,大概是17年-18年写了一个react全家桶的后台管理系统.猜测这个项目应该还一直在使用 在我手里的vue项目就比较多了,技术栈一直是vue全家桶.最近也在深入 ...
- 菜鸟VUER学习记——零0章、打开新的大门
是什么 基于MVVM模型,核心库只关注视图层,通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件的js框架.根据项目的复杂度和需求,渐进的加入插件以达到恰到好处的程度. 解决问题 UI组件化 ...
- Python打开新世界的大门-入门篇1
目录 题记 Python技巧.避坑及心得 八种数据类型 循环 函数 Homework 题外话 之前没有写博客的习惯,现在开始写觉得入门也太晚了吧,看看同龄的大哥都写了十几万字.于是 ...
- echart 打开新世界的大门
实时折线图 option = { backgroundColor:'#2B2B2B', tooltip: { trigger: 'axis' }, legend: { data:['频率'], tex ...
- cdq分治入门--BZOJ3262: 陌上花开
n<=100000个人,每个人三个属性Ai,Bi,Ci,一个人i的等级为Ai>=Aj,Bi>=Bj,Ci>=Cj的人数,求每个等级有多少人. 裸的三维偏序.按照常规思路,一维排 ...
- GoLang——Hello World,打开新世界的大门
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Go语言系列的第一篇文章,我们来聊聊这门新的语言和它的基础语法. 浅谈Golang 作为程序员而言,往往对于学习新的语言都是有抗拒的. ...
- bzoj 2163: 复杂的大门
2163: 复杂的大门 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 418 Solved: 259[Submit][Status][Discuss ...
- BZOJ2163: 复杂的大门
BZOJ2163: 复杂的大门 Description 你去找某bm玩,到了门口才发现要打开他家的大门不是一件容易的事……他家的大门外有n个站台,用1到n的正整数编号.你需要对每个站台访问一定次数以后 ...
随机推荐
- 12.Spring——Web MVC框架
1.Spring Web MVC 框架 2.Spring MVC Hello World 例子 1.Spring Web MVC 框架 Spring web MVC 框架提供了模型-视 ...
- Redis(三)Redis基本命令操作与API
一Redis 连接 Redis 连接命令主要是用于连接 redis 服务. 实例 以下实例演示了客户端如何通过密码验证连接到 redis 服务,并检测服务是否在运行: redis 127.0.0.1: ...
- [C++] 用Xcode来写C++程序[3] Constants
用Xcode来写C++程序[3] Constants 以下是一些基本数据的含义: 75 // int 75u // unsigned int 75l // long 75ul // unsigned ...
- UNIX高级环境编程(2)FIle I/O - 原子操作、共享文件描述符和I/O控制函数
引言: 本篇通过对open函数的讨论,引入原子操作,多进程通信(共享文件描述符)和内核相关的数据结构. 还会讨论集中常见的文件IO控制函数,包括: dup和dup2 sync,fsync和fdatas ...
- Log Structured Merge Trees (LSM)
1 概念 LSM = Log Structured Merge Trees 来源于google的bigtable论文. 2 解决问题 传统的数据库如MySql采用B+树存放数据,B ...
- 关于layui(layer)子页面获取不到父页面jQuery对象的问题。
如果在使用layui-layer模块过程中,在子页面执行代码: window.parent.$("#id").val() 报错:window.parent.$ is not a f ...
- jQuery 3D圆盘旋转焦点图 支持鼠标滚轮
之前我们分享过很多炫酷实用的jQuery焦点图插件了,今天介绍的这款jQuery焦点图非常特别,所有图片围成一个圆圈,组成一个立体视觉的圆盘,并且可以旋转选择圆盘中的图片.另外,这款jQuery 3D ...
- JavaScript的DOM操作获取元素的大小
通过 style 内联获取元素的大小 需要注意的是style 获取只能获取到行内 style 属性的 CSS 样式中的宽和高,如果有获取:如果没有则返回空. <!DOCTYPE html> ...
- OSSpinLockLock加锁机制,保证线程安全并且性能高
在aspect_add.aspect_remove方法里面用了aspect_performLocked, 而aspect_performLocked方法用了OSSpinLockLock加锁机制,保证线 ...
- const修饰的成员是类成员,还是实例成员?
很抱歉,我以为只有static修饰的成员是类成员,可以通过类名直接访问,然而,const 修饰的成员也属于类成员,直接通过类名访问,不能通过实例变量访问. 做维护久了,深刻的理解,扎实的基础对写出高质 ...