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显得无聊. ...
随机推荐
- [11-1] adaboost DTree
main idea:用与$u_t$成正比的概率sampling生成的数据集$\widetilde{D}$训练DTree:用整个数据集$D$计算weighted$\epsilon_n$,计算$g_t$的 ...
- Python学习笔记3-文件的简单操作
Python中的文件操作 Python中文件打操作离不开两个模块 os 和 shutil os:操作文件.目录: Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话, ...
- Python 操作 MySQL--(pymysql)
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
- string 转换char类型
将string转换成char类型 const char *c = string.c_str() char转换string char *c_name = "char" string ...
- Mysql 计算时间间隔函数
#计算两个时间的间隔 #计算间隔天数 select TIMESTAMPDIFF(day,'2014-06-01',date(now())) #计算间隔月数 select TIMESTAMPDIFF(m ...
- ORACLE 如何查询被锁定表及如何解锁释放session
ORACLE EBS操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作 --锁表查询SQLSELECT ...
- C#生成ACCESS文件几点注意事项
1.bin文件夹下有没有Interop.ADOX.dll文件. 2.当前服务器有没有安装access 64位驱动,若没有,可安装AccessDatabaseEngine_X64.exe文件. 3.生成 ...
- api (三)文本字符输出 (转)
在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接口(GDI)进行的,Windows的三大核心组件之一的GDI32.dll封装了所有的文本和 ...
- Windows使用过程中的一些常见问题的解决方案
Win8安装程序出现2502.2503错误解决方法 参见百度经验帖子:http://jingyan.baidu.com/article/a501d80cec07daec630f5e18.html
- char str[] 与 char *str的区别详细解析
char* get_str(void) { char str[] = {"abcd"}; return str; } char str[] = {"abcd"} ...