NEERC2017 Archery Tournament 线段树 新套路

题目链接

http://codeforces.com/gym/101630/attachments/download/6401/20172018-acmicpc-northeastern-european-regional-contest-neerc-17-en.pdf

题意

给出一些圆,这些圆圆心在x轴上方,且与x轴相切,任意时刻,不存在图上的圆相交,给出两种操作:增加一个圆;向图中发送一颗子弹,如果击中某个圆,输出该圆编号并且删掉这个圆。如果未击中,则输出-1。

题解

圆与x轴相切,且圆之间不相交,这说明,如果先把圆抽象成平行于x轴的线段的话,那么包含子弹横坐标的线段不超过log(N)log(N)个,这是一个很关键的条件。
如果我们能找出这些线段,那么我们就可以进行包含判定了。

下面关键的问题在于如何找出这些线段。
这里有一个骚操作,那就是使用线段树的方式。
我们先把圆一切两半,分别考虑,先考虑子弹打在右半边的情况,左半边的情况类似。
对于圆的右半边表示成线段就是[xr,xr+r][xr,xr+r],因为圆心不会重合,所以所有的xrxr都不相同,这也正是我们要把圆切开的原因。
将线段存在线段树里,线段树xrxr位置存放xr+rxr+r,代表一个线段。并且要求线段树支持区间查询最大值的操作。
下面展示如何定位到所有的包含子弹横坐标xbxb的线段。
我们采用分治的方法,初始待考虑区间为[0,xb][0,xb](这样保证了线段的左端点<xb<xb<script type="math/tex" id="MathJax-Element-917">xbxb(相当于判断线段的右端点>xb>xb),如果大于,说明在这个区间内有满足的线段,将区间进一步细分。
直到区间细分到长度为11<script type="math/tex" id="MathJax-Element-920">1</script>,停止,这就是一个满足条件的线段。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
const int maxn = 5e5+7;
int n;
int tp,x,y,len;
int segmx[maxn<<2],segmi[maxn<<2];
int al[maxn],cat = 0;
int mp[maxn];
#define pr(x) cout<<#x<<":"<<x<<endl
inline int getid(int x){return lower_bound(al,al+len,x) - al;
}
void updatemx(int rt,int l,int r,int pos,int x){if(l == r){segmx[rt] = x;return ;}int mid = (l+r)/2;if(pos <= mid) updatemx(rt*2,l,mid,pos,x);else updatemx(rt*2+1,mid+1,r,pos,x);segmx[rt] = max(segmx[rt*2],segmx[rt*2+1]);
}
void updatemi(int rt,int l,int r,int pos,int x){if(l == r){segmi[rt] = x;return ;}int mid = (l+r)/2;if(pos <= mid) updatemi(rt*2,l,mid,pos,x);else updatemi(rt*2+1,mid+1,r,pos,x);segmi[rt] = min(segmi[rt*2],segmi[rt*2+1]);
}int querymx(int rt,int l,int r,int ul,int ur){if(ul <= l && r <= ur)return segmx[rt];if(r < ul || l > ur) return -2e9;int mid = (l+r)/2;int ansl = querymx(rt*2,l,mid,ul,ur);int ansr = querymx(rt*2+1,mid+1,r,ul,ur);return max(ansl,ansr);
}int querymi(int rt,int l,int r,int ul,int ur){if(ul <= l && r <= ur)return segmi[rt];if(r < ul || l > ur) return 2e9;int mid = (l+r)/2;int ansl = querymi(rt*2,l,mid,ul,ur);int ansr = querymi(rt*2+1,mid+1,r,ul,ur);return min(ansl,ansr);
}
int tps[maxn],xs[maxn],ys[maxn];
int ans[maxn];
bool check(long long x,long long y,int id){long long dx = x - xs[id];long long dy = y - ys[id];if(dx*dx + dy*dy < y*y) return 1;return 0;
}
void dcmx(int l,int r,int id){int y = querymx(1,0,len-1,l,r);if(y <= xs[id]) return ;if(l == r){int x = al[l];y = y - x;if(check(x,y,id)) {ans[id] = mp[l];mp[l] = 0;updatemx(1,0,len-1,l,-2e9);updatemi(1,0,len-1,l,2e9);}return ;}int mid = (l+r)/2;dcmx(l,mid,id);dcmx(mid+1,r,id);}
void dcmi(int l,int r,int id){int y = querymi(1,0,len-1,l,r);if(y >= xs[id]) return ;if(l == r){int x = al[l];y = -y + x;if(check(x,y,id)) {ans[id] = mp[l];mp[l] = 0;updatemi(1,0,len-1,l,2e9);updatemx(1,0,len-1,l,-2e9);}return ;}int mid = (l+r)/2;dcmi(l,mid,id);dcmi(mid+1,r,id);}
int main(){scanf("%d",&n);for(int i = 1;i <= n;++i){scanf("%d%d%d",&tp,&x,&y);tps[i] = tp,xs[i] = x,ys[i] = y;if(tp == 1){al[cat++] = x;al[cat++] = x-y;al[cat++] = x+y;}else{al[cat++] = x;}}sort(al,al+cat);len = unique(al,al+cat) - al;memset(mp,0,sizeof(mp));for(int i = 0;i < maxn<<2;++i) segmx[i] = -2e9,segmi[i] = 2e9;for(int i = 1;i <= n;++i){int idx = getid(xs[i]);if(tps[i] == 1){mp[idx] = i;updatemx(1,0,len-1,getid(xs[i]),xs[i]+ys[i]);updatemi(1,0,len-1,getid(xs[i]),xs[i]-ys[i]);}else{dcmx(0,idx,i);dcmi(idx,len-1,i);}}for(int i = 1;i <= n;++i){if(tps[i] == 2){printf("%d\n",ans[i]?ans[i]:-1);}}return 0;
}

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

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

相关文章

P2178-[NOI2015]品酒大会【SA,并查集】

正题 题目链接:https://www.luogu.com.cn/problem/P2178 题目大意 长度为nnn的字符串&#xff0c;每个位置有一个权值。 如果对于q,pq,pq,p有sq,qr−1sp,pr−1s_{q,qr-1}s_{p,pr-1}sq,qr−1​sp,pr−1​那么就称q,pq,pq,p为rrr相似。 对于每个rrr求有多少对q,pq,pq,p是rrr相似…

【Floyed】【最短路】商店选址问题(ssl 1760)

商店选址问题 ssl 1760 题目大意&#xff1a; 有一些点&#xff0c;在一个点上按医院&#xff0c;有一个值就是这个点到其他点的最短路之和&#xff0c;问这个值最小是多少 原题&#xff1a; Description 给出一个城市的地图&#xff08;用邻接矩阵表示&#xff09;&…

一文看懂.NET的各种变体

曾几何时&#xff0c;我们只有一个.NET&#xff0c;叫作.NET Framework。如果想要开发.NET应用程序&#xff0c;只要使用.NET Framework即可&#xff0c;非常简单。几年之后&#xff0c;出现了.NET变种的寒武纪大爆发&#xff08;我们称之为“.NET大爆炸”&#xff09;&#xf…

Codeforces Gym - 100917 部分题解

A.Abstract Picture Gym - 100917A 分析&#xff1a;由于最后刷的一笔肯定使得某一行或者是某一列均为相同的颜色。 因此我们可以在一开始找到所有的行或者列&#xff0c;他们的颜色全都一样&#xff0c;把这样的行或列加入到队列里面去。 我们处理在队列里面的行或者列&…

【最短路】【Floyed】医院设置(ssl 1614)

医院设置 ssl 1614 题目大意&#xff1a; 有n个点&#xff0c;在一个点上安医院&#xff0c;使这个点到其他点的最短路之和最小 原题&#xff1a; Description 设有一棵二叉树&#xff08;如右图&#xff09;。其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数…

牛客练习赛69C-旅行【结论,最大生成树】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7329/C 题目大意 disx,ydis_{x,y}disx,y​表示x,yx,yx,y的所有路径的最短的边的最大值。 求一个1∼n1\sim n1∼n的排列&#xff0c;使得∑i2ndisi,i−1\sum_{i2}^ndis_{i,i-1}∑i2n​disi,i−1​最大 解题思路 首先一定是…

拓展 NLog 优雅的输送日志到 Logstash

在上上篇博客通过对aspnetcore启动前配置做了一些更改&#xff0c;以及对nlog进行了自定义字段&#xff0c;可以把请求记录输送到mysql&#xff0c;正式情况可能不会这么部署。因为近期也在学习elk&#xff0c;所以就打算做一个实例&#xff0c;结合nlog把日志输送到logstash&a…

曼哈顿距离与切比雪夫距离的转化及prufer序列

目录 曼哈顿距离与切比雪夫距离的相互转化prufer序列 1. 曼哈顿距离 与 切比雪夫距离 的相互转化 曼哈顿距离 |x1−x2||y1−y2|max(x1−x2y1−y2,x1−x2−y1y2,−x1x2y1−y2,−x1x2−y1y2)|x1−x2||y1−y2|max(x1−x2y1−y2,x1−x2−y1y2,−x1x2y1−y2,−x1x2−y1y2)|x_1 - x…

初一模拟赛总结(2019.3.9)

成绩&#xff1a; rank算上了其他大佬 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4222lyflyflyf230230230100100100303030000100100100333hkyhkyhky909090000000000909090444fyfyfy808080000606060000202020444whdwhdwhd808080202020606060000000666lth…

牛客练习赛69E-子串【树状数组】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7329/E 题目大意 给出一个nnn的排列&#xff0c;求有多少个区间[l,r][l,r][l,r]使得最大值是rrr&#xff0c;最小值是lll。 解题思路 首先对于一个位置的值作为左端点和右端点都有一段合法区间&#xff08;到左边第一个比…

[译]如何在.NET Core中使用System.Drawing?

你大概知道System.Drawing&#xff0c;它是一个执行图形相关任务的流行的API&#xff0c;同时它也不属于.NET Core的一部分。最初是把.NET Core作为云端框架设计的&#xff0c;它不包含非云端相关API。另一方面&#xff0c;.NET Core是跨平台框架&#xff0c;它不包含任何操作系…

【dfs】棋盘变幻

棋盘变幻 题目大意&#xff1a; 有一些棋子&#xff08;黑/白&#xff09;&#xff0c;可以将某一列的棋子颜色反转&#xff0c;要黑棋尽可能小 原题&#xff1a; 题目描述 小G在一个n*m的棋盘上随意放上了一些黑色的棋子&#xff0c;然后又在剩下所有没有放棋子的格子里放…

组合数学与数论函数专题

组合数学专题 专题简介 本专题包含了一些组合数学中常见的套路和方法,如拉格朗日插值,动态规划,容斥原理,狄利克雷卷积,线性筛,杜教筛 等等. 目录 2018 四川省赛GRISAIA (数论分块)HDU 6428 Calculate (狄利克雷卷积,线性筛)BZOJ4559 成绩比较 (动态规划,拉格朗日插值)BZOJ…

关于Visual Studio 2019的前期详情

近日&#xff0c;来自微软公司的 John Montgomery 正式宣布&#xff0c;Visual Studio 2019已进入开发阶段。Montgomery 表示&#xff0c;之所以选择在这个时间点公开这个消息&#xff0c;是因为微软准备在 GitHub 上公开可见的项目&#xff08;包括 .NET 和 Roslyn&#xff09…

nssl1522-简单数数题【dp】

正题 题目大意 nnn个数的一个集合&#xff0c;求一个有多少个子集使得这个子集的所有子集的权值和的和是mmm的倍数 解题思路 考虑dp&#xff0c;选中集合中每一个数的贡献次数是2∣S∣−12^{|S|-1}2∣S∣−1&#xff0c;设fi,j,kf_{i,j,k}fi,j,k​表示选到第iii&#xff0c;现…

蛋糕店

蛋糕店 题目大意&#xff1a; 有n个人&#xff0c;让他们排队&#xff0c;每个人都有一个愤怒值&#xff0c;总值为每个人的愤怒值乘上&#xff08;他在队列中的位置-1&#xff09;加在一起 原题&#xff1a; 题目描述 最近小G新开了一家蛋糕店。开业第一天&#xff0c;一…

开源的,跨平台的.NET机器学习框架ML.NET

微软在Build 2018大会上推出的一款面向.NET开发人员的开源&#xff0c;跨平台机器学习框架ML.NET。 ML.NET将允许.NET开发人员开发他们自己的模型&#xff0c;并将自定义ML集成到他们的应用程序中&#xff0c;而无需事先掌握开发或调整机器学习模型的专业知识。在采用通用机器学…

nssl1519-背包签到题【数论】

正题 题目链接:http://10.156.31.134/contestnew.aspx?cid189 题目大意 nnn种物品&#xff0c;每种aia_iai​个。放进kkk个有序盒子求方案数&#xff08;可以不放完&#xff09; 解题思路 不放完其实就是k1k1k1个盒子&#xff0c;插板法求CkaiaiC_{ka_i}^{a_i}Ckai​ai​​&…

【dfs】相似度

相似度 题目大意&#xff1a; 有两个图&#xff0c;问他们的相似度是多少&#xff08;相似度为连接两个点的相样线的条数&#xff09; 原题&#xff1a; 题目描述 小G通过摆放一些城市和道路构成了一个世界地图。趁着小G出去玩的时候&#xff0c;大G把小G的世界地图上的城…

虚树-树上动态规划的利器

虚树 问题引入 在一类树上动态规划问题中,题目给出的询问往往包含树上的很多各节点,并保证总的点数规模小于某个值. 如果我们直接在整颗树上进行dpdp的话,时间复杂度与询问的次数有关,这显然是不可接受的,如果我们可以找到一种动态规划的方法,使其时间复杂度与询问中点的实际…