Mokia(三维偏序)P4390
提到cdq,就不得不提这道该死的,挨千刀的题目了。
极简题面:
给定一个二维平面,在ti时刻会在(xi,yi)放一个点,会在tj时刻查询一个方框里面的点的数量
看道题就是二维线段树乱搞啊,这么水???
数据范围劝退警告
单是一维都快有点吃不消了...1e6*1e6的数组?几个GB???
。。。
于是,伟大的CDQ分治出场了。
题面其实可以这样翻译:
按时插入点,询问小于(x,y)且时间也小于当前点的点的个数
这不就是CDQ的事吗?比模板题还要裸。。。
但是可能要差分一下(二维差分)因为统计的是点与00组成的大矩形,所以要剪去两个矩形,再加上一个小矩形,所以要统计四个点的偏序
总结一下,就是cdq。
第一维时间,第二维x,第三维y
一定要离线做
于是开始了愉快的CDQ
#include<bits/stdc++.h>
using namespace std;
const int maxn=; struct node
{
int time,x,y,val,id;
}e[maxn];
int m,cnt,t[maxn<<],a[maxn],ans[maxn];
inline int lowbit(int x)
{
return x & - x ;
}
void add(int x,int y)
{
for(;x<=m;x+=lowbit(x))
{
t[x]+=y;
}
}
int ask(int x)
{
int res=;
for(;x;x-=lowbit(x))
{
res+=t[x];
}
return res;
}
bool cmp2(node a,node b)
{
if(a.x!=b.x)return a.x<b.x;
if(a.y!=b.y)return a.y<b.y;
//else return a.time<b.time;
}
bool cmp(node a,node b)
{
return a.time<b.time;
}
void cdq(int l,int r)
{
if(l==r)return;
int mid=l+r>>;
cdq(l,mid);
cdq(mid+,r);
sort(e+l,e++r,cmp2);
for(int i=l;i<=r;i++)
{
if(e[i].x<=mid&&e[i].id==)
add(e[i].y,e[i].val);
else e[i].val+=ask(e[i].y);
}
for(int i=l;i<=r;i++)
{
if(e[i].x<=mid&&e[i].id==)
add(e[i].y,-e[i].val);
}
}
int read()
{
int f=,x=;char s=getchar();
while(s>''||s<''){if(s=='-')f=-;s=getchar();}
while(s<=''&&s>=''){x=x*+s-'';s=getchar();}
return x*f;
}
int main()
{
read();
m=read();
int flag=read();
while(flag!=)
{
if(flag==)
{
int x=read()+,y=read()+,val=read();
e[++cnt]=(node){cnt,x,y,val,};
}
else
{
int x1=read(),yl=read(),x2=read()+,y2=read()+;
e[++cnt]=(node){cnt,x1,yl,,};//数据结构体化
e[++cnt]=(node){cnt,x2,y2,,};
e[++cnt]=(node){cnt,x2,yl,,};
e[++cnt]=(node){cnt,x1,y2,,};
}
flag=read();
}
cdq(,cnt);然后硬cdq就行了
sort(e+,e+cnt+,cmp);
for(int i=;i<=cnt;++i)
{
if(e[i].id==)
{
printf("%d\n",e[i].val+e[i+].val-e[i+].val-e[i+].val);
i+=;
}
}
return ;
}
(完)
Mokia(三维偏序)P4390的更多相关文章
- BZOJ 1176/2683 Mokia (三维偏序CDQ+树状数组)
题目大意: 洛谷传送门 三维偏序裸题.. 每次操作都看成一个三元组$<x,y,t>$,表示$x,y$坐标和操作时间$t $ 询问操作拆成$4$个容斥 接下来就是$CDQ$了,外层按t排序, ...
- P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)
题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫米.但其真正高科 ...
- SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治
Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...
- P3810 -三维偏序(陌上花开)cdq-分治
P3810 [模板]三维偏序(陌上花开) 思路 :按照 1维排序 二维 分治三维树状数组维护 #include<bits/stdc++.h> using namespace std; #d ...
- cdq分治解决三维偏序
问题背景 在三维坐标系中有n个点,坐标为(xi,yi,zi). 定义一个点A比一个点B小,当且仅当xA<=xB,yA<=yB,zA<=zB.问对于每个点,有多少个点比它小.(n< ...
- P3810 【模板】三维偏序(陌上花开)
P3810 [模板]三维偏序(陌上花开) cdq分治+树状数组 三维偏序模板题 前两维用cdq分治,第三维用树状数组进行维护 就像用树状数组搞逆序对那样做--->存权值的出现次数 attenti ...
随机推荐
- Android 总结:ContentProvider 的使用
一.概述 ContentProvider:为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据. Android内置的许多数据都是使用ContentProvider形式,供开发者调用的 ( ...
- SpringBoot系列:Spring Boot使用模板引擎Thymeleaf
一.Java模板引擎 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在jav ...
- 一步步剖析spring bean生命周期
关于spring bean的生命周期,是深入学习spring的基础,也是难点,本篇文章将采用代码+图文结论的方式来阐述spring bean的生命周期,方便大家学习交流. 一 项目结构及源码 1. ...
- BeetleX服务网关之限流和缓存
限流和缓存相关是网关中两个非常重要的功能,前者是保障服务更可靠地运行,后者则可以大大提高应用的吞吐能力.Beetlex.Bumblebee微服务网关提供了两个扩展插件来实现这两个功能,分别是Beetl ...
- slf4j+logback&logback.xml
添加maven依赖 <dependencies> <!--https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> ...
- JVM Java字节码的角度分析switch的实现
目录 Java字节码的角度分析switch的实现 引子 前置知识 一个妥协而又枯燥的方案 switch的实现 回顾历史 字节码分析 其他实现方式? Java字节码的角度分析switch的实现 作者 k ...
- Typesetting HDU - 6107
Yellowstar is writing an article that contains N words and 1 picture, and the i-th word contains aia ...
- Mr. Rito Post Office
あなたは離島の郵便局に勤めるプログラマである.あなたの住んでいる地域は,複数の島々からなる.各島には一つ以上の港町がある.それらに加えて他の町や村があるかもしない.ある島から別の島に向かうためには船を ...
- 分享Python知识的第三天
python第一节 1.变量 变量,是用于在内存中存放程序数据的容器 计算机的核心为"计算",计算便需要数据源,数据源要存在内存中方便使用,这时就要用到变量,比如把某人吗名字,年龄 ...
- java学习3-流程控制与数组
1.顺序结构 2.分支结构 3.循环结构 4.控制循环结构 break continue return 5.数组