BZOJ 2716 Violet 3 天使玩偶 CDQ分治
题目大意:初始给定平面上的一个点集。提供两种操作:
1.将一个点增加点集
2.查询距离一个点最小的曼哈顿距离
K-D树是啥。。。不会写。。。
我仅仅会CDQ分治
对于一个询问,查询的点与这个点的位置关系有四种,我们如今仅仅讨论左下角,剩余三个象限同理
设询问的点为(x,y),查询的点为(x',y')
则dis=(x-x')+(y-y')=(x+y)-(x'+y')
于是我们要找到查询的点左下方全部点中x'+y'最大的点。x值排序,y值维护树状数组就可以
用CDQ分治化在线为离线。保证x有序就可以
其他三个象限同理 记得讨论的时候别写差了 细致检查一下为好
此题80s真吓人。。
。
只是全然没有那么慢,不管是K-DTree还是CDQ分治都是半分钟解决这个问题。。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 500500
using namespace std;
struct point{
int x,y;
bool operator < (const point &p) const
{
return x < p.x;
}
}points[M];
struct abcd{
int p,x,y,pos,dis;
bool operator < (const abcd &z) const
{
if( x == z.x )
return pos < z.pos;
return x < z.x;
}
}q[M],nq[M];
int n,m,tot,maxnum;
int c[1001001],tim[1001001];
inline int getc() {
static const int L = 1 << 15;
static char buf[L], *S = buf, *T = buf;
if (S == T) {
T = (S = buf) + fread(buf, 1, L, stdin);
if (S == T)
return EOF;
}
return *S++;
}
inline int getint() {
int c;
while(!isdigit(c = getc()) && c != '-');
bool sign = c == '-';
int tmp = sign ? 0 : c - '0';
while(isdigit(c = getc()))
tmp = (tmp << 1) + (tmp << 3) + c - '0';
return sign ? -tmp : tmp;
}
inline void output(int x)
{
static int a[20];
if (x == 0)
putchar('0');
else {
int top = 0;
if (x < 0)
putchar('-'), x=-x;
while(x) {
a[++top] = x % 10;
x /= 10;
}
for(int i = top; i >= 1; --i)
putchar('0' + a[i]);
}
puts("");
}
void Update(int x,int y,int flag)
{
for(;x&&x<=maxnum;x+=(x&-x)*flag)
{
if(tim[x]!=tot)
c[x]=0xefefefef,tim[x]=tot;
c[x]=max(c[x],y);
}
}
int Get_Ans(int x,int flag)
{
int re=0xefefefef;
for(;x&&x<=maxnum;x+=(x&-x)*flag)
if(tim[x]==tot)
re=max(re,c[x]);
return re;
}
void CDQ(int l,int r)
{
int i,j,mid=l+r>>1;
int l1=l,l2=mid+1;
if(l==r)
{
if(q[mid].p==2)
output(q[mid].dis);
return ;
}
for(i=l;i<=r;i++)
{
if(q[i].pos<=mid)
nq[l1++]=q[i];
else
nq[l2++]=q[i];
}
memcpy( q+l , nq+l , sizeof(q[0])*(r-l+1) );
CDQ(l,mid);
for(++tot,j=l,i=mid+1;i<=r;i++)
if(q[i].p==2)
{
for(;j<=mid&&q[j].x<=q[i].x;j++)
if(q[j].p==1)
Update(q[j].y,q[j].x+q[j].y,1);
q[i].dis=min(q[i].dis,q[i].x+q[i].y-Get_Ans(q[i].y,-1) );
}
for(++tot,j=l,i=mid+1;i<=r;i++)
if(q[i].p==2)
{
for(;j<=mid&&q[j].x<=q[i].x;j++)
if(q[j].p==1)
Update(q[j].y,q[j].x-q[j].y,-1);
q[i].dis=min(q[i].dis,q[i].x-q[i].y-Get_Ans(q[i].y,1) );
}
for(++tot,j=mid,i=r;i>mid;i--)
if(q[i].p==2)
{
for(;j>=l&&q[j].x>=q[i].x;j--)
if(q[j].p==1)
Update(q[j].y,q[j].y-q[j].x,1);
q[i].dis=min(q[i].dis,q[i].y-q[i].x-Get_Ans(q[i].y,-1) );
}
for(++tot,j=mid,i=r;i>mid;i--)
if(q[i].p==2)
{
for(;j>=l&&q[j].x>=q[i].x;j--)
if(q[j].p==1)
Update(q[j].y,-q[j].x-q[j].y,-1);
q[i].dis=min(q[i].dis,-q[i].x-q[i].y-Get_Ans(q[i].y,1) );
}
CDQ(mid+1,r);
l1=l;l2=mid+1;
for(i=l;i<=r;i++)
{
if(q[l1]<q[l2]&&l1<=mid||l2>r)
nq[i]=q[l1++];
else
nq[i]=q[l2++];
}
memcpy( q+l , nq+l , sizeof(q[0])*(r-l+1) );
}
int main()
{
int i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
{
points[i].x=getint();
points[i].y=getint();
++points[i].x;++points[i].y;
maxnum=max(maxnum,points[i].y);
}
sort(points+1,points+n+1);
for(i=1;i<=m;i++)
{
q[i].p=getint();
q[i].x=getint();
q[i].y=getint();
++q[i].x;++q[i].y;
q[i].pos=i;
q[i].dis=0x3f3f3f3f;
maxnum=max(maxnum,q[i].y);
}
sort(q+1,q+m+1);
for(++tot,j=1,i=1;i<=m;i++)
if(q[i].p==2)
{
for(;j<=n&&points[j].x<=q[i].x;j++)
Update(points[j].y,points[j].x+points[j].y,1);
q[i].dis=min(q[i].dis,q[i].x+q[i].y-Get_Ans(q[i].y,-1) );
}
for(++tot,j=1,i=1;i<=m;i++)
if(q[i].p==2)
{
for(;j<=n&&points[j].x<=q[i].x;j++)
Update(points[j].y,points[j].x-points[j].y,-1);
q[i].dis=min(q[i].dis,q[i].x-q[i].y-Get_Ans(q[i].y,1) );
}
for(++tot,j=n,i=m;i;i--)
if(q[i].p==2)
{
for(;j&&points[j].x>=q[i].x;j--)
Update(points[j].y,points[j].y-points[j].x,1);
q[i].dis=min(q[i].dis,q[i].y-q[i].x-Get_Ans(q[i].y,-1) );
}
for(++tot,j=n,i=m;i;i--)
if(q[i].p==2)
{
for(;j&&points[j].x>=q[i].x;j--)
Update(points[j].y,-points[j].x-points[j].y,-1);
q[i].dis=min(q[i].dis,-q[i].x-q[i].y-Get_Ans(q[i].y,1) );
}
CDQ(1,m);
return 0;
}
BZOJ 2716 Violet 3 天使玩偶 CDQ分治的更多相关文章
- BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )
先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...
- BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...
- [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)
[BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...
- BZOJ 2716: [Violet 3]天使玩偶
2716: [Violet 3]天使玩偶 Time Limit: 80 Sec Memory Limit: 128 MBSubmit: 1473 Solved: 621[Submit][Statu ...
- bzoj 2716 [Violet 3]天使玩偶 【CDQ分治】
KD-tree可做,但是我不会暂时不考虑 大意:在二维平面内,给定n个点,m个操作.操作A:加入一个点:操作B:询问一个点与平面上加入的点的最近距离 不封装会T不封装会T不封装会T不封装会T不封装会 ...
- bzoj 2716 [Violet 3]天使玩偶——KDtree
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 第三道KDtree!仍旧是模板.还有CDQ分治做法,见下面. 数组迷之开大?(开6e5 ...
- BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree
[题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstd ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
随机推荐
- JNDI support differences between Tibco EMS and ActiveMQ
Introduction Recently our team was working on Veracity Quick Start sprint, when I was trying to migr ...
- ISO和UDF光盘格式、扩展ISO9660----Joliet和Romeo文件系统
ISO和UDF光盘格式.扩展ISO9660----Joliet和Romeo文件系统 刻录DVD盘,当文件大于2G的时候,Nero会提示NERO选文件时提示无法刻录这么大的文件,请转换格式.这到底是怎么 ...
- KO.js学习笔记(一)
1.官方网站:knockoutjs.com 2.要dom树加载完毕才能绑定数据 3.ui能实时更新,使用了ko的一个自定义属性:data-bind 4.可以对viewmodel中的属性添加subsci ...
- REST Web Server,REST介绍
参考资料: 1.http://www.chinalivedoor.com/story/1123.html 2. Backbone.js 是一种重量级javascript MVC 应用框架,通过Mod ...
- Spring、Hello Spring
1.引入Spring jar包 2.新建一个Person 接口和Person Bean public interface PersonIService { public void helloSprin ...
- SPOJ 1435 - Vertex Cover(树形DP,树的最小点覆盖)
算是个经典题目了,很模板的树形DP题目 做这个题的时候一开始就想到树形DP了,可是由于各种原因没写出来,代码太糟烂了,赛后还是改了好久才过的 dp(u,0)=sum(dp(v,1)): dp(u,1) ...
- 嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度
嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度 上一篇笔记介绍了一些绕开排程器(或调度程序,scheduler)来进行时间管理的一些小方法.这一篇详细介绍RTX的任务调度原理. RTX主要有 ...
- Robotium双client測试框架
互联网的本质就是信息交换.移动互联网更是如此, 所以很多移动互联网的服务类应用中有着身份地位不同的两种用户(比如:交易中的买家和卖家, 教学中的老师和学生, 打车中的车主和乘客).近期的工作是给公司的 ...
- 可解压带中文名称文件的zip包
package com.text.ziptest; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; i ...
- JS禁止/启用滚动条
//禁止滚动条 $(document.body).css({ "overflow-x": "hidden", "overflow-y": & ...