BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)
题目链接: 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分治、树状数组)的更多相关文章
- BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )
先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...
- BZOJ 2716 Violet 3 天使玩偶 CDQ分治
题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...
- [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)
[BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- BZOJ 2683 简单题 cdq分治+树状数组
题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- 【bzoj3262】陌上花开 CDQ分治+树状数组
题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...
- 【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 ...
- LOJ3146 APIO2019路灯(cdq分治+树状数组)
每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...
随机推荐
- spring boot-18.使用dubbo发布分布式服务
我们新建两个项目分别模拟服务的提供者和服务的消费者,spring boot 集成dubbo主要分为以下几个步骤: 1.安装zookeeper 推荐使用docker 安装,使用以下几个命令即可完成 (1 ...
- spring boot-9.对springMVC的支持
1.thymeleaf spring boot 推荐的模板引擎是thymeleaf.spring boot 的自动配置已经默认配置好了themleaf,只要导入themleaf的Starter就可以了 ...
- JNDI的初步理解
1.JDNI是什么意思? 答:JNDI是 java naming and directory interface 的缩写,是j2ee开发中的一种重要的规范 2.JNDI有什么用? 答:如果没有JNDI ...
- Matcher和Pattern总结
Matcher.Pattern简介 java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pat ...
- 【挣扎失败】2019CSP-S 游记
妈耶…… 今年是作为高中生参赛的第一年……然而…… 心痛 洛谷评分,一橙一蓝两紫两黑 我个菜鸡瑟瑟发抖 在考完后三天的信息课码的,刚写没几个字就要下课了 抽空把这个写完
- hugo搭建个人博客
本地先安装git 1. 下载hugo,并配置好环境变量 我这里win7 64位,选择该版本下载 将解压后的hugo.exe,配置到环境变量中,如下图所示表明配置成功 hugo version 2. 生 ...
- 同一路由带参刷新,以及params和query两种方式传参的异同
同一路由应该不叫跳转了吧,就先叫刷新好了. 需求及问题 今天做web课设有这样一个需求: 在导航栏中一项叫做教师队伍一级菜单下,有三个二级菜单,分别为教授.副教授.讲师.这三个二级菜单分别对应一个页面 ...
- 编写python爬虫采集彩票网站数据,将数据写入mongodb数据库
1.准备工作: 1.1安装requests: cmd >> pip install requests 1.2 安装lxml: cmd >> pip install lxml ...
- centos7 mysql 各种报错
1.重置root密码 vi /etc/my.cnf 添加skip-grant-tables service mysqld restart 2.mysql 登录 报错1 Unknown system v ...
- Linux--磁盘管理--04
1.磁盘的工作原理: 磁道.磁头.扇区.柱面 2.磁盘分类: 机械盘: 串行:SCSI.iSCSI.SATA 并行:ATA 固态盘:HDD 3.文件系统: Windows :fat32 ntfs ...