BZOJ2716天使玩偶
不会KD-tree怎么办?CQD硬搞。
建立正常的平面直角坐标系,首先我们只考虑在目标点左下角的点对目标点的贡献,由于左下点的横纵坐标都小于目标点,那么曼哈顿距离就可以化简了,绝对值去掉后,得到$x2+y2-(x1+y1)$,那么我们的目标就转化为了求横纵坐标以及时间轴都小于目标查询点的更改点所作出的贡献,这是一个三维偏序问题,我们在树状数组中维护x+y的最大值,进而即可更新答案。
可是这样做我们只是考虑了左下角点的贡献,肯定是会出错的,但是其余位置的点不容易化简绝对值,或者化简完以后的形式比较难以维护,而且个人认为分类的话码量略大。
那么我们换一个角度,如何将其余位置的点都变化到目标点的左下角。
直接翻转坐标系就行了,把所有点的横纵坐标都翻转一下,使之分别落于其他象限。那么再次调用cdq即可,注意防负下标。
这样打的好处就是比较无脑,而且正确性保障很大,但是常数这种东西还是很神奇的。(本代码不保证Bzoj可A)(其实应该不可A,因为main函数返回值是signed)
- #include<bits/stdc++.h>
- #define lowbit(x) (x&(-x))
- #define int long long
- using namespace std;
- const int inf=0x7fffffffffffff;
- int read(){
- int sum=,f=;char x=getchar();
- while(x<''||x>''){
- if(x=='-') f=-;
- x=getchar();
- }while(x>=''&&x<=''){
- sum=sum*+x-'';
- x=getchar();
- }return sum*f;
- }
- struct rec{
- int x,y,t,id,ty;
- friend bool operator < (const rec &a,const rec &b){
- if(a.t==b.t){
- if(a.x==b.x) return a.y<b.y;
- else return a.x<b.x;
- }else return a.t<b.t;
- }
- }q[],tmp[];
- int n,m,kind,Max,ans[],tr[],_time=,mk[];
- void change(int pos,int val){
- if(!pos) return ;
- for(int i=pos;i<=Max;i+=lowbit(i))
- if(mk[i]!=_time){
- mk[i]=_time;
- tr[i]=val;
- }
- else tr[i]=max(tr[i],val);
- }
- int ask(int pos){
- int ans=-inf;
- for(int i=pos;i;i-=lowbit(i))
- if(mk[i]==_time) ans=max(ans,tr[i]);
- return ans;
- }
- void cdq(int l,int r){
- if(l==r) return ;
- int mid=l+r>>;
- cdq(l,mid);cdq(mid+,r);
- int i=l,j=mid+,tot=l;
- while(i<=mid&&j<=r){
- if(q[i].x<=q[j].x){
- tmp[tot]=q[i];
- if(!q[i].ty)
- change(q[i].y,q[i].x+q[i].y);
- ++tot;++i;
- }else {
- tmp[tot]=q[j];
- if(q[j].ty)
- ans[q[j].id]=min(ans[q[j].id],q[j].x+q[j].y-ask(q[j].y));
- ++tot;++j;
- }
- }
- while(i<=mid){
- tmp[tot]=q[i];
- // if(!q[i].ty)
- // change(q[i].y,q[i].x+q[i].y);
- ++tot;++i;
- }
- while(j<=r){
- tmp[tot]=q[j];
- if(q[j].ty)
- ans[q[j].id]=min(ans[q[j].id],q[j].x+q[j].y-ask(q[j].y));
- ++tot;++j;
- }
- /* for(int i=1;i<=Max;i++)
- cout<<tr[i]<<" ";cout<<endl;*/
- // for(int k=l;k<=mid;k++)
- // if(!q[i].ty) del(q[k].y);
- /* for(int i=1;i<=Max;i++)
- cout<<tr[i]<<" ";cout<<endl;*/
- _time++;
- // if(_time>=10000000000) _time=1;
- for(int k=l;k<=r;k++) q[k]=tmp[k];
- }
- signed main(){
- n=read();m=read();
- for(int i=;i<=n;i++){
- q[i].x=read()+;q[i].y=read()+;
- q[i].t=;q[i].ty=;
- Max=max(Max,max(q[i].x,q[i].y));
- }
- for(int i=;i<=m;i++){
- kind=read();
- if(kind&){
- q[i+n].x=read()+;q[i+n].y=read()+;
- q[i+n].t=i;q[i].ty=;
- }else {
- q[i+n].x=read()+;q[i+n].y=read()+;
- q[i+n].t=i;q[i+n].ty=;
- q[i+n].id=++ans[];
- ans[ans[]]=inf;
- }
- Max=max(Max,max(q[i+n].x,q[i+n].y));
- }n+=m;
- // cout<<"Max="<<Max<<endl;
- sort(q+,q+n+);
- cdq(,n);
- /* for(int i=1;i<=n;i++)
- cout<<q[i].t<<" "<<q[i].x<<" "<<q[i].y<<endl;*/
- for(int i=;i<=n;i++) q[i].x=-q[i].x+Max+;
- sort(q+,q++n);
- /* for(int i=1;i<=n;i++)
- cout<<q[i].t<<" "<<q[i].x<<" "<<q[i].y<<endl;*/
- cdq(,n);
- for(int i=;i<=n;i++) q[i].y=-q[i].y+Max+;
- sort(q+,q++n);
- cdq(,n);
- for(int i=;i<=n;i++) q[i].x=-q[i].x+Max+;
- sort(q+,q+n+);
- cdq(,n);
- for(int i=;i<=ans[];i++)
- printf("%lld\n",ans[i]);
- return ;
- }
BZOJ2716天使玩偶的更多相关文章
- [BZOJ2716]天使玩偶
[BZOJ2716]天使玩偶 题目大意: 一个平面直角坐标系,坐标\(1\le x,y\le10^6\).\(n(n\le10^6)\)次操作,操作包含以下两种: 新增一个点\((x,y)\): 询问 ...
- [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)
[BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...
- bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*
bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...
- bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子
P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
- BZOJ 2716: [Violet 3]天使玩偶
2716: [Violet 3]天使玩偶 Time Limit: 80 Sec Memory Limit: 128 MBSubmit: 1473 Solved: 621[Submit][Statu ...
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )
先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...
- CH4701 天使玩偶
题意 4701 天使玩偶 0x40「数据结构进阶」例题 描述 题目PDF 样例输入 2 3 1 1 2 3 2 1 2 1 3 3 2 4 2 样例输出 1 2 来源 石家庄二中Violet 3杯省选 ...
随机推荐
- HTML 标签入门
HTML 简介 定义: 超文本标记语言(html)是标准通用标记语言下的一个应用,也是一种规范,一种标准 它通过标记符号来表示网页中的各个部分,网页文件本身是一种文本文件,通过在文本文件中添加标记符, ...
- mac os安装mtr
MTR是Linux平台上一款非常好用的网络诊断工具,集成了traceroute.ping.nslookup的功能,用于诊断网络状态非常有用 现使用的方法是下载pkg包手动安装 mtr的pkg下载地址 ...
- 0-1背包问题——回溯法求解【Python】
回溯法求解0-1背包问题: 问题:背包大小 w,物品个数 n,每个物品的重量与价值分别对应 w[i] 与 v[i],求放入背包中物品的总价值最大. 回溯法核心:能进则进,进不了则换,换不了则退.(按照 ...
- 部署Java项目到阿里云服务器(Ubuntu16.04 64位)
生成Jar包 1.进入到项目所在的路径下,打开cmd命令控制台,使用如下命令打包项目. mvn package --前提将项目中使用的maven配置到系统的环境变量中 2.打包完成的jar包在项目目录 ...
- sql server动态分页
USE RYPlatformManagerDB GO SET ANSI_NULLS, QUOTED_IDENTIFIER ON GO CREATE Proc [dbo].[WEB_PageView] ...
- Android studio如何连接三星手机
打开Android studio,选择Trouble Shoot device connections: 这个菜单项会自动扫描本地已经用USB线连接的设备: 已经成功扫描出了我的Galaxy C7 P ...
- javascript动态添加html节点
之前一直没怎么接触需要动态添加和删除html节点的项目,这次项目中用到了,也学习了. 在一个<table id="tab">标签中添加一个<tr id=" ...
- 安装xshell、xftp
1.Xshell的软件的下载.安装 xshell是一个终端模拟软件,而且是远程近程都可以. 就是模拟服务器所在的linux,在xshell中可以输入命令, 就像在服务器的linux中输入命令一样.一般 ...
- (一)AppScan的安装及破解
IBM AppScan是一款目前最好用的Web 应用安全测试工具,Rational AppScan 可自动化 Web 应用的安全漏洞评估工作,能扫描和检测所有常见的 Web 应用安全漏洞,例如 SQL ...
- archlinux 使用 postgresql
一.安装与初始化 1.初始化数据目录 默认安装后已创建 postgres 系统用户 切换到 postgres 用户 $ sudo -iu postgres # Or su - postgres for ...