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)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...
随机推荐
- Zookeeper群起脚本启动失败及查看状态出现:Error contacting service. It is probably not running
1.问题: 群起脚本启动后查看jps没有出现:QuorumPeerMain Zookeeper正常启动但是群起脚本查状态出现:Error contacting service. It is proba ...
- webpack的介绍
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5EAAAGpCAIAAACbBiUBAAAgAElEQVR4Aey9CVwb553/L04JcSPuw5
- SpringMVC上传文件总结
如果是maven项目 需要在pom.xml文件里面引入下面两个jar包 <dependency> <groupId>commons-fileupload</groupId ...
- 数位dp(不要62)
http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内满足以下条件的数量 1.数位不能出现4,2.任意两相邻数位不能是62. 解法:数位dp[po ...
- python3 enum模块的应用
python枚举模块的学习 ps:小编刚开始学习没多久,部分资源来源于其他网友,如有出错,麻烦联系修改哈,互帮互助,共同进步 一.枚举与字典类型 字典类型的缺点:1.值可变 2.没有防止相同标签的功能 ...
- centos 7下nginx搭建流媒体服务器【动态添加模块】
1.安装nginx依赖包 yum install gcc gcc-c++ openssl-devel zlib-devel pcre pcre-devel yamdi 2.下载解压nginx_mod_ ...
- The Preliminary Contest for ICPC Asia Shanghai 2019 A. Lightning Routing I
传送门 因为某些原因,所以我就去学了 $LCT$ 维护直径, $LCT$ 维护直径我上一个博客讲得很详细了:传送门 这里维护虚儿子用的是 $multiset$ ,没写可删堆 #include<i ...
- vue-cli中开发生产css注入形式不同导致bug
开发环境和生产环境不同导致的差异.主要是css层级有变动:开发环境只是单纯的使用了style-loader进行style标签插入,不进行额外的处理,比如说资源合并和添加md5后缀等,这样做是为了让编译 ...
- openapi
https://www.breakyizhan.com/swagger/2810.html https://www.cnblogs.com/serious1529/p/9318115.html htt ...
- 接口测试断言详解(Jmeter)
接口测试是目前最主流的自动化测试手段,它向服务器发送请求,接收和解析响应结果,通过验证响应报文是否满足需求规约来验证系统逻辑正确性.接口的响应类型通过Content-Type指定,常见的响应类型有: ...