题目大意:

洛谷传送门

这明明是一道KD-Tree,CDQ分治是TLE的做法

化简式子,$|x1-x2|-|y1-y2|=(x1+y1)-(x2+y2)$

而$CDQ$分治只能解决$x1 \leq x2,y1 \leq y2$的情况

把每次插入操作都相当于一个三元组$<x,y,t>$,权值是$x+y$。这就是一个三维偏序问题,用树状数组维护最大值即可

所以通过坐标变换,跑$4$次$CDQ$就行了?

没错,你会像我一样T得飞起

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 1001000
#define M1 1001000
#define ll long long
#define dd double
#define inf 233333333
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m,ma,nm,mx,my;
struct BIT{
int ma[M1];
void update(int x,int w){ for(int i=x;i<=my;i+=(i&(-i))) ma[i]=max(ma[i],w); }
int query(int x){ int ans=-inf; for(int i=x;i;i-=(i&(-i))) ans=max(ans,ma[i]); return ans; }
void clr(int x){ for(int i=x;i<=my;i+=(i&(-i))) ma[i]=-inf;}
void init(){ for(int i=;i<=my;i++) ma[i]=-inf; }
}s;
struct node{int x,y,p,t,ans;}a[N1],tmp[N1];
int cmp1(node s1,node s2){ if(s1.x!=s2.x) return s1.x<s2.x; if(s1.y!=s2.y) return s1.y<s2.y; return s1.p<s2.p;}
int cmpt(node s1,node s2){ return s1.t<s2.t; }
int que[N1],tl; void CDQ(int L,int R)
{
if(R-L<=) return;
int i,j,k,M=(L+R)>>;
for(i=L,j=M,k=L;k<R;k++)
{
if(a[k].t<M) tmp[i++]=a[k];
else tmp[j++]=a[k];
}
for(k=L;k<R;k++) a[k]=tmp[k];
CDQ(L,M);
for(i=L,j=M;i<M&&j<R;)
{
if(cmp1(a[i],a[j])){ if(a[i].p==) { s.update(a[i].y,a[i].x+a[i].y); que[++tl]=i; } i++; }
else{ if(a[j].p==) a[j].ans=min(a[j].ans,(a[j].x+a[j].y)-s.query(a[j].y)); j++; }
}
while(j<R){ if(a[j].p==) a[j].ans=min(a[j].ans,(a[j].x+a[j].y)-s.query(a[j].y)); j++; }
while(tl){ s.clr(a[que[tl--]].y); }
CDQ(M,R);
for(i=L,j=M,k=;i<M&&j<R;)
{
if(cmp1(a[i],a[j])) tmp[++k]=a[i++];
else tmp[++k]=a[j++];
}
while(i<M){ tmp[++k]=a[i++]; }
while(j<R){ tmp[++k]=a[j++]; }
for(k=L;k<R;k++) a[k]=tmp[k-L+];
}
int p[N1]; int main()
{
int i,j; n=gint(); m=gint(); nm=n+m;
for(i=;i<=n;i++){ a[i].p=; a[i].x=gint()+; a[i].y=gint()+; a[i].t=i; a[i].ans=inf; mx=max(mx,a[i].x); my=max(my,a[i].y); }
for(i=n+;i<=n+m;i++){ a[i].p=gint(); a[i].x=gint()+; a[i].y=gint()+; a[i].t=i; a[i].ans=inf; mx=max(mx,a[i].x); my=max(my,a[i].y); }
sort(a+,a+nm+,cmp1); s.init();
CDQ(,nm+);
for(i=;i<=nm;i++){ a[i].x=mx-a[i].x+; } sort(a+,a+nm+,cmp1);
CDQ(,nm+);
for(i=;i<=nm;i++){ a[i].y=my-a[i].y+; } sort(a+,a+nm+,cmp1);
CDQ(,nm+);
for(i=;i<=nm;i++){ a[i].x=mx-a[i].x+; } sort(a+,a+nm+,cmp1);
CDQ(,nm+);
sort(a+,a+nm+,cmpt);
for(i=n+;i<=nm;i++) if(a[i].p==) printf("%d\n",a[i].ans);
return ;
}

BZOJ 2716/2648 SJY摆棋子 (三维偏序CDQ+树状数组)的更多相关文章

  1. BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)

    题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数 ...

  2. BZOJ 1176/2683 Mokia (三维偏序CDQ+树状数组)

    题目大意: 洛谷传送门 三维偏序裸题.. 每次操作都看成一个三元组$<x,y,t>$,表示$x,y$坐标和操作时间$t $ 询问操作拆成$4$个容斥 接下来就是$CDQ$了,外层按t排序, ...

  3. BZOJ 2141 排队 (三维偏序CDQ+树状数组)

    题目大意:略 洛谷传送门 和 [CQOI2015]动态逆序对 这道题一样的思路 一开始的序列视为$n$次插入操作 把每次交换操作看成四次操作,删除$x$,删除$y$,加入$x$,加入$y$ 把每次操作 ...

  4. BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)

    题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等 ...

  5. 洛谷P3810-陌上开花(三维偏序, CDQ, 树状数组)

    链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay < ...

  6. 【bzoj 2716】[Violet 3]天使玩偶 (CDQ+树状数组)

    题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的 ...

  7. bzoj3262陌上花开 三维数点 cdq+树状数组

    大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 ...

  8. 【BZOJ】2648: SJY摆棋子 & 2716: [Violet 3]天使玩偶(kdtree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2716 http://www.lydsy.com/JudgeOnline/problem.php?id ...

  9. bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

随机推荐

  1. eclipse断点调试教程

    1.断点就是你希望程序运行到哪暂停, 2.断点就是你希望程序运行到哪暂停, 3.断点就是你希望程序运行到哪暂停,断点往往就是你觉得程序可能出错的地方.  设定断点的办法很简单,在你认为出错的那一行的行 ...

  2. 先验概率 vs 后验概率

    其实还不是很懂.看了这篇文章: http://blog.csdn.net/passball/article/details/5859878   事情还没有发生,要求这件事情发生的可能性的大小,是先验概 ...

  3. 谈论java中怎样处理高并发的问题

    1 从最基础的地方做起,优化我们写的代码,降低必要的资源浪费.         a.避免频繁的使用new对象.对于整个应用仅仅须要存在一个实例的类.我们能够使用单例模式. 对于String连接操作,使 ...

  4. Android Handler消息机制深入浅出

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38408493 作为Android开发者,Handler这个类应该是再熟悉只是了.由于差点儿不 ...

  5. sizeof运算符、malloc函数及free函数

    一.sizeof运算符的用法 1.sizeof运算符给出某个类型或变量在内存中所占据的字节数. int a;  sizeof(a)=4;  //sizeof(int)=4; double b;  si ...

  6. Spring Boot:Exception parsing document: template="index", line 7 - column 3

    转自:https://blog.csdn.net/u010429286/article/details/75447561

  7. 【算法】Quick Select

    针对问题 找到一对无序的数中第  K  大,或者第 K 小的元素,返回该元素的值或者它的 index(index 的情况比较适合这堆数每个都独一无二的情况,不然可能会有多个答案). 关键思想 拿一个数 ...

  8. POJ 3122 二分

    大致题意: 就是公平地分披萨pie 我生日,买了n个pie,找来f个朋友,那么总人数共f+1人 每个pie都是高为1的圆柱体,输入这n个pie的每一个尺寸(半径),如果要公平地把pie分给每一个人(就 ...

  9. No control record for Activity type 1000/4220/1442 in version 000 / 2017 activity planning/qty planning

    No control record for Activity type 1000/4220/1442 in version 000 / 2017 activity planning/qty plann ...

  10. 第7章 性能和可靠性模式 Failover Cluster(故障转移群集)

    上下文 您已经决定在设计或修改基础结构层时使用群集以提供高度可用的服务. 问题 您应该如何设计一个高度可用的基础结构层,来防止因单台服务器或它所运行的软件出现故障而导致的服务丢失? 影响因素 在设计高 ...