题目链接: 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. CSS3新特性(阴影、动画、渐变)

    一.阴影 1.1文字阴影: text-shadow<length>①: 第1个长度值用来设置对象的阴影水平偏移值.可以为负值 <length>②: 第2个长度值用来设置对象的阴 ...

  2. MySQL -2- 体系结构

    1. 体系结构 1.1 C/S(客户端/服务端)模型介绍   image TCP/IP方式(远程.本地): mysql -uroot -poldboy123 -h 10.0.0.51 -P3306 S ...

  3. Comet OJ - Contest #13

    Rank53. 第一次打这种比赛.还是有不少问题的,以后改吧. A题WA了两次罚了不少时. C写到一半发现只能过1,就先弃了. D一眼没看出来.第二眼看出来就是一个类似于复数的快速幂. 然后B切了. ...

  4. 不要64 数位DP

    Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来 ...

  5. python之代码规范

    第一章 为什么要有规范化目录 真正的后端开发的项目,系统等,少则几万行代码,多则十几万,几十万行代码 软件开发,规范你的项目目录结构,代码规范,遵循PEP8规范等等,让你更加清晰,合理开发. 1.代码 ...

  6. Android应用安全开发之源码安全

    Android应用安全开发之源码安全 gh0stbo · 2016/01/21 10:24 0x00 简介 Android apk很容易通过逆向工程进行反编译,从而是其代码完全暴露给攻击者,使apk面 ...

  7. vue项目--vuex状态管理器

    本文取之官网和其他文章结合自己的理解用简单化的语言表达.用于自己的笔记记录,也希望能帮到其他小伙伴理解,学习更多的前端知识. Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态 ...

  8. oracle分页查询按日期排序失败问题

    今天对已经上线的代码进行测试,结果发现分页是失效的,一度怀疑是前台页面分页失效,排查后发现是分页sql有问题,分页sql按日期排序,导致分页失败. 按日期排序,会造成相同的数据重复出现. 解决方案:在 ...

  9. 搭建docker+k8s踩过的坑

    问题一: # yum install -y etcd kubernetes Error: docker-ce-cli conflicts with :docker--.gitb2f74b2.el7.c ...

  10. logstash操作

    1.安装 1>安装java 2> #wget https://artifacts.elastic.co/downloads/logstash/logstash-5.6.3.tar.gz#t ...