题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716

怎么KD树跑得都那么快啊。。我写的CDQ分治被暴虐

做四遍CDQ分治,每次求一个左下角\(x_i+y_i\)的最大值

第一种写法是一开始按时间排序,然后CDQ分治的时候改成按\(x\)坐标排序,同时用树状数组统计每个\(y\)坐标的最大值

第二种写法是一开始按\(x\)坐标排序,然后CDQ分支的时候改成按时间排序

CDQ分治好神奇(琦)。。。

一定要注意树状数组如果没有元素不能返回0! 我这么写然后test1 WA on line 40W+...

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<algorithm>
using namespace std; const int N = 1e6;
const int C = 1e6+2;
struct Query
{
int opt,x,y,id,ans;
bool operator <(const Query &arg) const {return id<arg.id;}
} qr[N+3],qr2[N+3];
int tr[C+3];
int n,q,mx; void modify(int lrb,int val)
{
while(lrb<=mx)
{
tr[lrb] = max(tr[lrb],val);
lrb += (lrb&(-lrb));
}
} int querymax(int rb)
{
int ret = -C*2;
while(rb>0)
{
ret = max(ret,tr[rb]);
rb -= (rb&(-rb));
}
return ret;
} void clear(int lrb)
{
while(lrb<=mx && tr[lrb]!=-C*2)
{
tr[lrb] = -C*2;
lrb += (lrb&(-lrb));
}
} void cdqdc(int lb,int rb)
{
if(lb==rb) return;
int mid = (lb+rb)>>1;
int j = lb,k = mid+1;
for(int i=lb; i<=rb; i++)
{
if(qr[i].id<=mid) {qr2[j] = qr[i]; j++;}
else {qr2[k] = qr[i]; k++;}
}
for(int i=lb; i<=rb; i++) qr[i] = qr2[i];
cdqdc(lb,mid);
cdqdc(mid+1,rb);
j = lb; k = mid+1;
while(k<=rb)
{
while(j<=mid && qr[j].opt==2) j++;
while(k<=rb && qr[k].opt==1) k++;
if(k>rb) break;
while(j<=mid && qr[j].x<=qr[k].x)
{
if(qr[j].opt==1) {modify(qr[j].y,qr[j].x+qr[j].y);}
j++;
}
int tmp = querymax(qr[k].y);
qr[k].ans = min(qr[k].ans,qr[k].x+qr[k].y-tmp);
k++;
}
for(int i=lb; i<=mid; i++) {if(qr[i].opt==1) clear(qr[i].y);}
j = lb; k = mid+1;
for(int i=lb; i<=rb; i++)
{
if(j>mid || (k<=rb && qr[k].x<qr[j].x)) {qr2[i] = qr[k]; k++;}
else {qr2[i] = qr[j]; j++;}
}
for(int i=lb; i<=rb; i++) qr[i] = qr2[i];
} int main()
{
scanf("%d%d",&n,&q);
for(int i=1; i<=n; i++)
{
scanf("%d%d",&qr[i].x,&qr[i].y); qr[i].opt = 1; qr[i].id = i; qr[i].x++; qr[i].y++; qr[i].ans = C*7;
mx = max(mx,max(qr[i].x,qr[i].y));
}
for(int i=n+1; i<=n+q; i++)
{
scanf("%d%d%d",&qr[i].opt,&qr[i].x,&qr[i].y,&qr[i].opt); qr[i].id = i; qr[i].x++; qr[i].y++; qr[i].ans = C*7;
mx = max(mx,max(qr[i].x,qr[i].y));
}
q+=n;
for(int i=0; i<=mx; i++) tr[i] = -C*2;
cdqdc(1,q);
sort(qr+1,qr+q+1);
for(int i=1; i<=q; i++) {qr[i].x = mx+1-qr[i].x;}
cdqdc(1,q);
sort(qr+1,qr+q+1);
for(int i=1; i<=q; i++) {qr[i].y = mx+1-qr[i].y;}
cdqdc(1,q);
sort(qr+1,qr+q+1);
for(int i=1; i<=q; i++) {qr[i].x = mx+1-qr[i].x;}
cdqdc(1,q);
sort(qr+1,qr+q+1);
for(int i=1; i<=q; i++)
{
if(qr[i].opt==2) printf("%d\n",qr[i].ans);
}
return 0;
}

BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)的更多相关文章

  1. BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )

    先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...

  2. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

  3. [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)

    [BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...

  4. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  5. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

  6. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  7. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

  8. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  9. LOJ3146 APIO2019路灯(cdq分治+树状数组)

    每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...

随机推荐

  1. 用Python制作动态二维码

    参考来源链接:https://mp.weixin.qq.com/s/p-ptQZD6_bjUhmU822OPww 今天在最大的同性交友社区GitHub上发现了一个比较有意思的项目,无论你是什么操作系统 ...

  2. Linux的环境变量.bash_profile .bashrc profile文件

    Shell变量有局部变量.环境变量之分.局部变量就是指在某个Shell中生效的变量,只在此次登录中有效.环境变量通常又称“全局变量”,虽然在Shell中变量默认就是全局的,但是为了让子Shall继承当 ...

  3. Linux端口是否占用的方法

    1.netstat或ss命令 netstat -anlp | grep 80 2.lsof命令 这个命令是查看进程占用哪些文件的 lsof -i:80 3.fuser命令 fuser命令和lsof正好 ...

  4. 通过yum安装maven

    安装maven wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/y ...

  5. 腾讯万亿级分布式消息中间件TubeMQ正式开源

    TubeMQ是腾讯在2013年自研的分布式消息中间件系统,专注服务大数据场景下海量数据的高性能存储和传输,经过近7年上万亿的海量数据沉淀,目前日均接入量超过25万亿条.较之于众多明星的开源MQ组件,T ...

  6. 1-Kubernetes基本概念

    Kubernetes中的大部分概念如Node.Pod.Replication Controller.Service等都可以看作一种"资源对象",几乎所有的资源对象都可以通过Kube ...

  7. 剑指offer-1:旋转数组的最小数字

    旋转数组的最小数字1.题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2 ...

  8. python virtualenv和virtualenv的使用

    首先下面的步骤我都是在windows下执行,Python2.7,pip==19.1.1 1.安装virtualenv pip install virtualenv 2.新建virtualenv vir ...

  9. 007-zabbix Server 4.0 监控TCP的12种状态

    大家对TCP三次握手比较熟悉了,都知道当发生DOSS攻击时,客户端发送SYN给服务端后,服务端响应SYN+ACK,此时客户端就不回应服务端ACK啦(如果正常建立三次握手客户端会回应ACK,表示三次握手 ...

  10. MYSQL explain详解[转载]

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 虽然这篇文章我写的很长,但看起来真的不会困啊,真的都是干货啊!!!! 先解析 ...