题目链接:https://vjudge.net/problem/Gym-101630A

题目大意:

  有\(n\)个操作,每次输入\(t\) \(x\) \(y\)\((t=1,2; -10^9 \le x,y \le 10^9; y > 0)\). 当\(t=1\),在坐标平面上立一个圆心在\(x,y\),半径为\(y\)的圆形靶子。当\(t=2\),往点\(x,y\)射一箭,如果在这个点上有靶子,则输出这个靶子是在第几次操作中出现的,并把这个靶子销毁;如果这个点上没有靶子,则输出\("-1"\)。

知识点:  线段树、离散化

解题思路:

  首先,肯定要离散化处理数据。然后用线段树套\(<set>\)(目的是方便删除操作)维护区间中有什么靶子。更新和删除的时候只要找到合适的区间就可以进行操作然后\(return\),不用\(push\) \(up\)或\(push\) \(down\),查询的时候则直到找到合适的靶子或者\(l==r\)为止。

AC代码:

 #include <bits/stdc++.h>

 using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef pair<int,int> P;
typedef long long ll;
const int maxn=2e5+; struct Input{
int t;
ll x,y;
}inp[maxn];
ll xs[maxn<<];
map<ll,int> ind;
set<int> tree[maxn<<];
void update(int L,int R,int c,int l,int r,int rt){
if(L<=l&&r<=R){
tree[rt].insert(c);
return;
}
int m=(l+r)>>;
if(L<=m) update(L,R,c,lson);
if(R>m) update(L,R,c,rson);
}
void era(int L,int R,int c,int l,int r,int rt){
if(L<=l&&r<=R){
tree[rt].erase(c);
return;
}
int m=(l+r)>>;
if(L<=m) era(L,R,c,lson);
if(R>m) era(L,R,c,rson);
}
int query(int pos,int _x,int _y,int l,int r,int rt){
if(l<=pos&&pos<=r){
set<int>::iterator it=tree[rt].begin();
for(;it!=tree[rt].end();it++){
int now=*it;
if((inp[now].x-_x)*(inp[now].x-_x)+(inp[now].y-_y)*(inp[now].y-_y)<inp[now].y*inp[now].y)
return now;
}
}
if(l==r) return -;
int m=(l+r)>>;
if(pos<=m) return query(pos,_x,_y,lson);
else return query(pos,_x,_y,rson);
}
int main(){
// freopen("in.txt","r",stdin);
int n,cnt=;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%lld%lld",&inp[i].t,&inp[i].x,&inp[i].y);
if(inp[i].t==)
xs[cnt++]=inp[i].x-inp[i].y,xs[cnt++]=inp[i].x+inp[i].y;
}
sort(xs,xs+cnt);
int m=unique(xs,xs+cnt)-xs;
for(int i=;i<m;i++){
ind[xs[i]]=i;
}
for(int i=;i<=n;i++){
if(inp[i].t==)
update(ind[inp[i].x-inp[i].y]+,ind[inp[i].x+inp[i].y],i,,m-,);
else{
int pos=-;
int l=,r=m-;
while(l<=r){
int mid=(l+r)>>;
if(xs[mid-]>inp[i].x) r=mid-;
else if(xs[mid]<inp[i].x) l=mid+;
else{
pos=mid;
break;
}
}
if(pos==-) printf("-1\n");
else{
int ret=query(pos,inp[i].x,inp[i].y,,m-,);
if(ret==-)
printf("-1\n");
else{
printf("%d\n",ret);
era(ind[inp[ret].x-inp[ret].y]+,ind[inp[ret].x+inp[ret].y],ret,,m-,);
}
}
}
}
return ;
}

Gym101630A Archery Tournament的更多相关文章

  1. 2017-2018 ACM-ICPC Northern Eurasia(A.Archery Tournament)

    题目链接:https://vjudge.net/problem/Gym-101630A 题意: n个事件,t=1 代表增加一个圆心为(x,y),半径为 abs(y)的靶子,t=2,代表射击的坐标为(x ...

  2. A - Archery Tournament 动态开点+vecotor 神仙题

    存图还是像矩形一样的存,每个节点存所在区级内部的圆的编号,然后暴力判断,开始我也有这个想法,但是...这TM也能过...仔细想想,貌似好像是可以过,时间复杂度玄学无法证明.... #include&l ...

  3. NEERC-2017

    A. Archery Tournament 用线段树套set维护横坐标区间内的所有圆,查询时在$O(\log n)$个set中二分查找即可. 时间复杂度$O(n\log^2n)$. #include& ...

  4. 【做题】neerc2017的A、C、I、L

    A - Archery Tournament 一开始往化简公式的方向去想,结果没什么用. 考虑与一条垂线相交的圆的个数.不难YY,当圆的个数最多时,大概就是这个样子的: 我们稍微推一下式子,然后就能发 ...

  5. 2017 NEERC

    2017 NEERC Problem A. Archery Tournament 题目描述:在二维平面上,会陆续出现一些圆,以及一些询问,询问点是否在圆内,如果是,则输出那个圆,并把那个圆删掉,否则输 ...

  6. 2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17) 日常训练

    A - Archery Tournament 题目大意:按时间顺序出现靶子和射击一个位置,靶子的圆心为(x, y)半径为r,即圆与x轴相切,靶子不会重叠,靶子被击中后消失, 每次射击找出哪个靶子被射中 ...

  7. Codeforces CF#628 Education 8 A. Tennis Tournament

    A. Tennis Tournament time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. Rock-Paper-Scissors Tournament[HDU1148]

    Rock-Paper-Scissors TournamentTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  9. CF 628A --- Tennis Tournament --- 水题

    CF 628A 题目大意:给定n,b,p,其中n为进行比赛的人数,b为每场进行比赛的每一位运动员需要的水的数量, p为整个赛程提供给每位运动员的毛巾数量, 每次在剩余的n人数中,挑选2^k=m(m & ...

随机推荐

  1. hdu_1050 Moving Tables 贪心

    Moving Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  2. 【React踩坑记六】create-react-app创建的react项目通过iP地址访问(实现局域网内访问)

    同项目组的小伙伴想用自己的电脑访问我电脑上开发阶段的create-react-app创建的react项目. 试过了了各种内网穿透工具ngrok以及localtunnel等. 奈何打开效率实在太过于龟速 ...

  3. 你所不知道的Python | 字符串连接的秘密

    字符串连接,就是将2个或以上的字符串合并成一个,看上去连接字符串是一个非常基础的小问题,但是在Python中,我们可以用多种方式实现字符串的连接,稍有不慎就有可能因为选择不当而给程序带来性能损失. 方 ...

  4. 覆盖equals 时总要覆盖hashCode(9)

    2019独角兽企业重金招聘Python工程师标准>>> 1.在每个覆盖了equals 方法的类中,也必须覆盖hashCode 这是关于hashCode 的通用约定 这样可以与 基于散 ...

  5. centos 7.0运行docker出现内核报错解决方法

    目前我这里docker是运行在centos 7.0系统里,使用1.5版本docker,最近一台服务器总是不定期死机,通过查看日志发现属于内核bug导致,报错信息如下 1 2 3 4 5 6 7 8 9 ...

  6. usermod,用户密码管理,mkpasswd命令

    passwd是更改用户密码的文件,如果在root下,我们可以直接输入这个命令更改密码[root@localhost ~]# passwd更改用户 root 的密码 .新的 密码:如果想更改其他用户的密 ...

  7. Muduo网络库实战(二):实现服务器与客户端的连接

    1. 方案的确定 1)基本需求 用户1000+, IO压力不大: 多个客户端打开网站,输入查询字符串strclient,发送给服务器=>服务器接收客户端发过来的数据并处理,将结果返回给客户端: ...

  8. AWS访问慢的原因分析及解决方案

    中国区的用户在访问海外AWS服务器的时候会遇到访问很慢的情况,那如何快速访问海外AWS服务器,今天和大家一起聊一下这个话题. 首先,为什么中国的用户访问海外AWS会变慢? 我总结来下大概有以下几方面的 ...

  9. 数据库SQL语言从入门到精通--Part 3--SQL语言基础知识

    数据库从入门到精通合集(超详细,学习数据库必看) 一.关系 单一的数据结构----关系 现实世界的实体以及实体间的各种联系均用关系来表示 逻辑结构----二维表 从用户角度,关系模型中数据的逻辑结构是 ...

  10. CodeForces - 1047A

    A. Little C Loves 3 I time limit per test1 second memory limit per test256 megabytes inputstandard i ...