YbtOJ#20236-[冲刺NOIP2020模拟赛Day9]红点蓝点【线段树,堆】

正题

题目链接:https://www.ybtoj.com.cn/contest/66/problem/4


题目大意

平面上nnn个红点,nnn个蓝点,对于没一个红点求一个与它纵坐标距离不超过ddd的一个点与它的曼哈顿距离最短。


解题思路

一个点分为两种情况,在询问点左边的红点要求横坐标大,在询问点右边的红点要求横坐标小,为了方便,我们开两个线段树。

依次从上往下扫描点,然后将蓝点加入两个线段树中,注意扫描位置变换时我们要让所有加入的点的值加上一个移动的距离(即纵坐标的距离差)。然后因为要把加入的超出范围的点弹出去,所以我们在线段树的每个叶子处维护一个堆即可。

然后正反各扫一次即可。

因为叶子处维护,所以堆和线段树实际复杂度是分开的,时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e5+10,Lim=1e8,inf=1e9;
struct point{int x,y,dl,dr;
}a[N],b[N];
int n,d,cnt,c[N<<1],ans[N];
struct Heap{priority_queue<int> q1,q2;void push(int x){q1.push(x);return;}void pop(int x){q2.push(x);return;}bool empty(){return (q1.size()-q2.size())==0;}int top(){while(!q2.empty()&&q1.top()==q2.top())q1.pop(),q2.pop();return q1.top();}void clear(){while(!q1.empty())q1.pop();while(!q2.empty())q2.pop();return;}
};
struct node{Heap q[N<<3];int w[N<<3],lazy[N<<3];void Clear(){for(int i=1;i<N<<3;i++)w[i]=-inf,lazy[i]=0,q[i].clear();}void Downdata(int x){if(!lazy[x])return;lazy[x*2]+=lazy[x];lazy[x*2+1]+=lazy[x];w[x*2]+=lazy[x];w[x*2+1]+=lazy[x];lazy[x]=0;return;}void Push(int x,int l,int r,int pos,int &val){if(l==r){val-=lazy[x];q[x].push(val);if(!q[x].empty())w[x]=q[x].top()+lazy[x];else w[x]=-inf;return;}int mid=(l+r)>>1;Downdata(x);if(pos<=mid)Push(x*2,l,mid,pos,val);else Push(x*2+1,mid+1,r,pos,val);w[x]=max(w[x*2],w[x*2+1]);return;}void Pop(int x,int l,int r,int pos,int val){if(l==r){q[x].pop(val);if(!q[x].empty())w[x]=q[x].top()+lazy[x];else w[x]=-inf;return;}int mid=(l+r)>>1;Downdata(x);if(pos<=mid)Pop(x*2,l,mid,pos,val);else Pop(x*2+1,mid+1,r,pos,val);w[x]=max(w[x*2],w[x*2+1]);return;} int Ask(int x,int L,int R,int l,int r){if(l>r)return -inf; if(L==l&&R==r)return w[x];int mid=(L+R)>>1;Downdata(x);if(r<=mid)return Ask(x*2,L,mid,l,r);if(l>mid)return Ask(x*2+1,mid+1,R,l,r);return max(Ask(x*2,L,mid,l,mid),Ask(x*2+1,mid+1,R,mid+1,r)); }
}Tl,Tr;
bool cmp(point x,point y)
{return x.x<y.x;}
void work(){sort(a+1,a+1+n,cmp);sort(b+1,b+1+n,cmp);int l=1,r=1;Tl.Clear();Tr.Clear();for(int i=1;i<=n;i++){if(i!=1){Tl.lazy[1]-=b[i].x-b[i-1].x;Tr.lazy[1]-=b[i].x-b[i-1].x;Tl.w[1]-=b[i].x-b[i-1].x;Tr.w[1]-=b[i].x-b[i-1].x;}while(r<=n&&a[r].x<=b[i].x){int w=lower_bound(c+1,c+1+cnt,a[r].y)-c;Tl.Push(1,1,cnt,w,a[r].dl=a[r].y-b[i].x+a[r].x);Tr.Push(1,1,cnt,w,a[r].dr=Lim-a[r].y-b[i].x+a[r].x);r++;}while(l<=n&&b[i].x-a[l].x>d){int w=lower_bound(c+1,c+1+cnt,a[l].y)-c;Tl.Pop(1,1,cnt,w,a[l].dl);Tr.Pop(1,1,cnt,w,a[l].dr);l++;}int w=lower_bound(c+1,c+1+cnt,b[i].y)-c;ans[b[i].dl]=min(ans[b[i].dl],b[i].y-Tl.Ask(1,1,cnt,1,w));ans[b[i].dl]=min(ans[b[i].dl],Lim-Tr.Ask(1,1,cnt,w+1,cnt)-b[i].y);}
}
int main()
{freopen("portal.in","r",stdin);freopen("portal.out","w",stdout);scanf("%d%d",&n,&d);for(int i=1;i<=n;i++)scanf("%d%d",&b[i].x,&b[i].y),b[i].dl=i,swap(b[i].x,b[i].y),c[i+n]=b[i].y;for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y),swap(a[i].x,a[i].y),c[i]=a[i].y;sort(c+1,c+1+2*n);memset(ans,0x3f3f3f3f,sizeof(ans));cnt=unique(c+1,c+1+2*n)-c-1;work();for(int i=1;i<=n;i++)a[i].x=Lim-a[i].x,b[i].x=Lim-b[i].x;work();for(int i=1;i<=n;i++)if(ans[i]>=1e9)printf("0\n");else printf("%d\n",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rinne Loves Xor

链接&#xff1a; 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 输入描述: 第一行一个整数 N&#xff0c;表示数组 A 和 B 的长度。 第二行 N …

小麦亩产一千八(jzoj 3461)

小麦亩产一千八 jzoj 3461 题目大意 给你一个正整数序列&#xff1a;a0,a1,a2a_0,a_1,a_2a0​,a1​,a2​…… a0a_0a0​为1 a1a_1a1​为p axax−1ax−2(x>1)a_xa_{x-1} a_{x-2}(x>1)ax​ax−1​ax−2​(x>1) 现在给你三个数x&#xff0c;ax&#xff0c;yx&#xf…

Pipelines - .NET中的新IO API指引(一)

原文&#xff1a;https://blog.marcgravell.com/2018/07/pipe-dreams-part-1.html作者&#xff1a;marcgravell大约两年前&#xff0c;我发表了一篇关于.NET中即将到来的体验性新IO API的博文——在那时它被叫做"Channels"&#xff1b;在2018年的五月末&#xff0c;它…

[XSY] 分割(dfs树)

分割 题目相当于问 删掉两个点后 图是否仍然连通 割点问题&#xff0c;考虑用dfs树解决 设删去点u&#xff0c;v&#xff08;dfn[v]<dfn[u]&#xff09; 把 u, v 删去之后整棵树大概断成了几个部分&#xff1a; • v 上面到根的部分&#xff0c;以及上面挂着的那些东西&…

P4068-[SDOI2016]数字配对【二分,费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P4068 题目大意 nnn种数字&#xff0c;第iii个是aia_iai​&#xff0c;有bib_ibi​个&#xff0c;价值为ci∗cjc_i*c_jci​∗cj​ 如果一个数字axa_xax​和aya_yay​配对要求axay\frac{a_x}{a_y}ay​ax​​是一个质数且产生c…

三分法讲解

二分用到的挺多&#xff0c;三分用的少&#xff0c;但也不能忘。。。 二分我们常常用于一个具有单调性的情况中求解某值 而三分就像是求一个凸性或凹形函数时&#xff0c;来求那个凹凸点 一开始L0&#xff0c;Rinf&#xff0c;然后也是不断缩小L与R的范围&#xff0c;逼近最值…

秀姿势(jzoj 3464)

秀姿势 jzoj 3464 题目大意 有n个数&#xff0c;每个数都有一个分组&#xff0c;现在问你最多去掉k个分组后&#xff0c;做多有多少个数是连续的同组的 输入样例 9 1 2 7 3 7 7 3 7 5 7输出样例 4样例解释 总共有9个学生&#xff0c;最多只能刷一次学生。 若不刷&#x…

使用C#读写结构化的二进制文件

最近工作上遇到一个问题&#xff0c;就是有将近200万个CSV文件&#xff0c;每个CSV文件包含了成千上万条实验数据&#xff0c;CSV以一个不连续的整数值作为文件名&#xff0c;比如&#xff1a;1.CSV、2.CSV、3.CSV、5.CSV等等。另外又有200万个XML文件&#xff0c;每个XML文件的…

[XSY] 相似(DP套DP)

相似 在看这道题前&#xff0c;有必要先看一下DP套DP的入门题[uoj3864]Hero meet devil&#xff0c;附上两篇写得不错的题解&#xff1a; https://blog.csdn.net/Ike940067893/article/details/87863041 https://www.cnblogs.com/RabbitHu/p/BZOJ3864.html 可以发现&#xff…

P3295-[SCOI2016]萌萌哒【ST表,并查集】

正题 题目链接:https://www.luogu.com.cn/problem/P3295 题目大意 一个nnn位的数字&#xff0c;mmm个条件给出两个完全相同的区间&#xff0c;求可能的数字数量。 解题思路 其实就是区间中的每个数字分别连边&#xff0c;但是这样显然会TTT。考虑通过消耗查询的复杂度来平衡…

牛客IOI周赛16-普及组

比赛链接 文章目录求导题目描述题解&#xff1a;猜数题意&#xff1a;题解&#xff1a;方法一 贪心方法二 暴力答题卡题意&#xff1a;题解&#xff1a;代码&#xff1a;求导 链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C …

【归并排序】休息(jzoj 3462)

休息 jzoj 3462 题目大意 给你一个序列&#xff0c;你每一回合把它划分成尽可能少的单调递减的序列&#xff08;第一次划分到的序列长度都是偶数&#xff09;&#xff0c;然后把每个序列翻转&#xff0c;问你把它变成单调递增的序列要翻转多少次 输入样例 6 5 3 2 1 6 4输…

Pipelines - .NET中的新IO API指引(二)

原文&#xff1a;Pipelines - a guided tour of the new IO API in .NET, part 2作者&#xff1a;marcgravell在上一章&#xff0c;我们讨论了以往的StreamAPI中存在的一些问题&#xff0c;并且介绍了Pipe,PipeWriter,PipeReader 等API&#xff0c;研究如何写出一个Pipe 并且从…

[XSY] 线图(树形DP、分类讨论)

线图 如图&#xff0c;每个L(L(T))上的点对应T上的一条三点链 在连接L(L(T))上两点&#xff0c;当且仅当两点代表的三点链在T上有共边&#xff0c;且边权为 共边边权*2非共边1边权非共边2边权 在L(L(T))上从点u走到点v&#xff0c;等价于u代表的三点链在T上删掉自己的一条边&…

Bzoj3309-DZY Loves Math【莫比乌斯反演,线性筛】

正题 bzoj没了&#xff0c;在darkbzoj交吧 题目链接:https://darkbzoj.tk/problem/3309 题目大意 定义f(x)f(x)f(x)表示xxx所有质因数中最大的指数幂。 求∑i1n∑j1mf(gcd(i,j))\sum_{i1}^n\sum_{j1}^mf(\ gcd(i,j)\ )i1∑n​j1∑m​f( gcd(i,j) ) 解题思路 很显然要用莫反…

牛客网【每日一题】4月29日题目精讲 Symmetric Matrix

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld题目描述 输入描述: The input consists of several test cases and is terminated by end-of-file. Each test c…

邻接矩阵和邻接表的使用

邻接矩阵和邻接表的使用 邻接矩阵 为了遍历一个图&#xff0c;我们使用了邻接矩阵&#xff0c;及用ai,ja_{i,j}ai,j​表示由a到b的边权 注&#xff1a;若这两个点不相连或ijijij&#xff0c;那么这个值就会设定为一个非正常的值&#xff0c;以便遍历时特判不走这条边 使用&am…

YbtOJ#20239-[冲刺NOIP2020模拟赛Day10]连边方案【状压dp】

正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/3 题目大意 求有多少个nnn个点mmm条边的无向图满足 有连边的点之间编号差不超过kkk所有点的度数都为偶数 解题思路 因为kkk很小&#xff0c;所以我们考虑状压一个点前kkk个点的奇偶状态。设fi,j,s,0/1f_{i,j,s,…

有上下界网络流问题汇总

无源汇有上下界可行流 法一&#xff08;据说适合点少边多的图&#xff09;&#xff1a; 建图方法 首先建立附加源点ss和附加汇点tt对于原图中的边x->y&#xff0c;若限制为[b,c]&#xff0c;那么连边x->y&#xff0c;流量为c-b对于原图中的某一个点i&#xff0c;记d(i…

一个迄今为止最快的并发键值存储库FASTER诞生

FASTER在过去十年中&#xff0c;云中的数据密集型应用程序和服务有了巨大的增长。数据在各种边设施&#xff08;例如&#xff0c;设备&#xff0c;浏览器和服务器&#xff09;上创建&#xff0c;并由云应用程序处理用来获得数据价值或做出决策。应用程序和服务可以处理收集的数…