正题

题目链接: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;
}

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

  1. [NOIP10.6模拟赛]2.equation题解--DFS序+线段树

    题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...

  2. YbtOJ#20235-[冲刺NOIP2020模拟赛Day9]公共序列【dp】

    正题 题目链接:https://www.ybtoj.com.cn/contest/66/problem/3 题目大意 给出两个字符串A,BA,BA,B,求它们的最长公共子序列. 解题思路 先考虑朴素的 ...

  3. YbtOj 冲刺 NOIP2020 模拟赛 Day10 T1 区间均值

    文章目录 ResultResultResult HyperlinkHyperlinkHyperlink DescriptionDescriptionDescription SolutionSoluti ...

  4. YbtOJ#20240-[冲刺NOIP2020模拟赛Day10]弱者对决【笛卡尔树,区间dp】

    正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/4 题目大意 mmm个三元组(ai,bi,ci)(a_i,b_i,c_i)(ai​,bi​,ci ...

  5. YbtOj#20073. 「NOIP2020 模拟赛 B 组 Day6」钻石守卫

    文章目录 ResultResultResult HyperlinkHyperlinkHyperlink DescriptionDescriptionDescription SolutionSoluti ...

  6. 2018CCPC吉林赛区(重现赛)补题部分——F线段树待补

    A - The Fool 数论分块暴力求和 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optim ...

  7. YbtOJ#20237-[冲刺NOIP2020模拟赛Day10]区间均值【树状数组】

    正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/1 题目大意 nnn个数字的序列,求有多少个区间[l,r][l,r][l,r]的平均值在[L,R ...

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

    正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/3 题目大意 求有多少个nnn个点mmm条边的无向图满足 有连边的点之间编号差不超过kkk 所有 ...

  9. GDOI冲刺训练模拟赛第一套总结

    DAY 1 拿到题一看,第一题显然是水题,跳. 第二题看起来非常不好做,想了一会儿没思路,看了一下暴力70分可能是可以离散化后跑最短路的,跳. 第三题这种路径表示的问题一般用点分,可是之后的部分好像只 ...

最新文章

  1. 网络营销——专业的站内、站外优化还是得靠专业网络营销公司
  2. Spring3注解@Component、@Repository、@Service、@Controller区别
  3. UI(1)---2018 UI 设计趋势
  4. 2017年WorkApplication牛客网线上机试题
  5. 微信小程序开发者文档 开放文档 地址
  6. 基于蒙特卡诺的风场景模型出力(Matlab代码实现)
  7. Ubuntu防火墙安装和配置
  8. 《计算机网络教程》(微课版 第五版)第三章 数据链路层 课后习题及答案
  9. 2020新版小桔灯作文能力阶梯序列作文课件教案教材全套
  10. dubbo服务出现大量超时问题
  11. 97. Interleaving String
  12. 微信公众号java开发沉淀(五)推送群发消息
  13. 抖音app开发时,在录制视频添加背景音乐功能实现流程
  14. 高德地图自定义地图怎么去除最上边这个默认的蓝色天空?太丑了!!
  15. 主流DDR2内存芯片编号解析
  16. GitHub狂飙30K+star面试现场,专为程序员面试打造,现已开源可下载
  17. js 获取当前年月日
  18. 测绘工程与计算机论文,(完整版)测绘工程毕业论文.doc
  19. 融资性担保公司如何做好担保业务及其风险控制?
  20. 研报精选230207

热门文章

  1. influxdb mysql对比_InfluxDB和MySQL的读写对比测试
  2. 5单个编译总会编译全部_VS2019 v16.5 MSVC编译器后端更新汇总
  3. python csv文件读取行列_使用Numpy读取CSV文件,并进行行列删除的操作方法
  4. ubuntu mysql怎么备份_Ubuntu下MySQL备份与异地备份
  5. c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)
  6. Linux中 安装centos-release-scl 报错No package centos-release-scl available.
  7. 7-3 作业调度算法--高响应比优先 (40 分)(思路+详解+vector容器做法)Come Baby!!!!!
  8. C++ 学习之旅(3)——头文件Header
  9. php防止cc攻击代码,防cc攻击PHP防CC攻击实现代码
  10. string函数知识点总结