题目


分析

首先如果不会\(\text{K-DTree}\)的话,那就用CDQ分治吧

这题首先要去绝对值,分四种情况讨论, 只判断左下角的点

然后考虑怎样求最大值,这里采用树状数组,反正只是单点修改单点查询,

而且树状数组常数小,可以用树状数组实现,下标为纵坐标,存入横纵坐标之和

类似于归并排序的方法按照横坐标排序,处理\([l,mid]\)的区间来解决\([mid+1,r]\)的问题


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
const int N=600011; bool nee[N];
struct rec{int x,y,rk; bool ne;}Q[N<<1],q[N];
int c[N<<1],ans[N],mx,my,mmx,mmy,n,m;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void Min(int &a,int b){if (a>b) a=b;}
inline void Max(int &a,int b){if (a<b) a=b;}
inline void updzro(int x){for (;x<=mmy;x+=-x&x) if (c[x]) c[x]=0; else return;}
inline void update(int x,int y){for (;x<=mmy;x+=-x&x) Max(c[x],y);}
inline signed query(int x){rr int ans=0; for (;x;x-=-x&x) Max(ans,c[x]); return ans;}
inline void CDQ(int l,int r){
if (l==r) return;
rr int mid=(l+r)>>1,j=l;
CDQ(l,mid),CDQ(mid+1,r);
for (rr int i=mid+1;i<=r;++i)
if (Q[i].ne){
for (;j<=mid&&Q[j].x<=Q[i].x;++j)
if (!Q[j].ne) update(Q[j].y,Q[j].x+Q[j].y);
rr int t=query(Q[i].y);
if (t) Min(ans[Q[i].rk],Q[i].x+Q[i].y-t);
}
for (rr int i=l;i<j;++i)
if (!Q[i].ne) updzro(Q[i].y);
rr int i1=l,j1=mid+1,cnt=0;
for (;i1<=mid&&j1<=r;)
if (Q[i1].x<=Q[j1].x) q[++cnt]=Q[i1],++i1;
else q[++cnt]=Q[j1],++j1;
for (;i1<=mid;++i1) q[++cnt]=Q[i1];
for (;j1<=r;++j1) q[++cnt]=Q[j1];
for (rr int i=l;i<=r;++i) Q[i]=q[i-l+1];
}
inline void Clear(bool ne1,bool ne2){
mmx=mmy=m=0; rr rec T;
for (rr int i=1;i<=n;++i) Q[i]=Q[i+n];
if (ne1) for (rr int i=1;i<=n;++i) Q[i].x=mx-Q[i].x+1;
if (ne2) for (rr int i=1;i<=n;++i) Q[i].y=my-Q[i].y+1;
for (rr int i=1;i<=n;++i) if (Q[i].ne)
Max(mmx,Q[i].x),Max(mmy,Q[i].y);
for (rr int i=1;i<=n;++i)
if (Q[i].x<=mmx&&Q[i].y<=mmy) T=Q[++m],Q[m]=Q[i],Q[i]=T;
}
signed main(){
n=iut(),m=iut(),memset(ans,42,sizeof(ans));
for (rr int i=1;i<=n;++i){
rr int x=iut()+1,y=iut()+1;
Q[i]=(rec){x,y,i,0},Max(mx,x),Max(my,y);
nee[i]=0;
}
while (m--){
rr int z=iut()-1,x=iut()+1,y=iut()+1;
Q[++n]=(rec){x,y,n,z},Max(mx,x),Max(my,y),nee[n]=z;
}
for (rr int i=1;i<=n;++i) Q[i+n]=Q[i];
Clear(0,0),CDQ(1,m),Clear(1,0),CDQ(1,m),
Clear(0,1),CDQ(1,m),Clear(1,1),CDQ(1,m);
for (rr int i=1;i<=n;++i)
if (nee[i]) print(ans[i]),putchar(10);
return 0;
}

#cdq分治,树状数组#洛谷 4169 [Violet]天使玩偶/SJY摆棋子的更多相关文章

  1. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)

    [Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...

  2. 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告

    P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...

  3. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子

    %%%神仙\(SJY\) 题目大意: 一个二维平面,有两种操作: \(1.\)增加一个点\((x,y)\) \(2.\)询问距离\((x,y)\)曼哈顿最近的一个点有多远 \(n,m\le 300 0 ...

  4. [Violet]天使玩偶/SJY摆棋子 [cdq分治]

    P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...

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

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

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

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

  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. BZOJ 2683 简单题 cdq分治+树状数组

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

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

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

随机推荐

  1. 【Android逆向】反调试绕过

    1. 拿到52pojie的反调试挑战apk 链接: https://www.52pojie.cn/thread-742686-1-1.html 的附件中 2. 项目进行安装,点开app,同时挑战成功, ...

  2. RAID 10磁盘阵列实践

    RAID概述 RAID技术通过把多个硬盘设备组合成一个容量更大.安全性更好的磁盘阵列,利用分散读写技术来提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理硬盘设备上,从而起到了非常好的数 ...

  3. Telegraph多线程下载器v0.5--tkinter

    介绍 最近在拿python写一点小工具,结合之前的多线程.线程池技术做了个GUI版的Telegraph图册批量下载工具. 因为开发平台是在Mac,虽然对Windows平台的也进行了打包,但最垃圾的Wi ...

  4. urllib模块常用方法

    import urllib.parse ## urlparse() 对url进行解析,并对url按照一定格式进行拆分,返回一个包含6个字符串的元组(协议,位置,路径,参数,查询,判断), 可以将获得的 ...

  5. 【LeetCode贪心#02】摆动序列,麻了

    摆动序列 力扣题目链接(opens new window) 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动 ...

  6. 第127篇:异步函数(async和await)练习题(异步,消息队列)

    好家伙,本篇为做题思考 书接上文   题目如下:  1.请给出下列代码的输出结果,并配合"消息队列"写出相关解释 async function foo() { console.lo ...

  7. rpa使用自带数据抓取方式抓取页面元素

    大家好,我是一方. 今天我们一起看一下如何使用rpa自带的功能来抓取自己想要的页面元素,这里我们以抖音为例来抓取某个领域的作者列表. 想要获取页面元素,大概的流程为:确定页面元素.分析页面元素.使用自 ...

  8. 深入浅出Java多线程(十):CAS

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十篇内容:CAS.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在多线程编程中,对共享资源的安全访问和同步 ...

  9. 浅谈IT系统性能优化

    一个刚上线的IT系统,往往负载压力不大,所以不会存在什么性能问题.这时,人们大多只关心系统的功能性和用户体验.但是,随着时间推移,用户量和数据量都比刚上线的时候要多很多,高并发和大数据场景下,系统遇到 ...

  10. opus编解码的特色和优点

    概念原理   Opus是一个有损音频压缩的数字音频编码格式,由Xiph.Org基金会开发,之后由互联网工程任务组(IETF)进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis ...