CodeChef - TELEPORT
题目链接:https://vjudge.net/problem/CodeChef-TELEPORT
题目大意:
有\(Q\)个指令,指令为:\(+\) \(x\) \(y\)(在二维平面内添加一个点,坐标为\((x,y)\));或\(?\) \(i\) \(j\)(如果第\(i\)个指令所添加的点和第\(j\)个指令所添加的点联通,则打印 "DA",否则打印 “NET").
关于联通的定义:如果每个点能到达的区域为\({(a,b):|a-x|+|b-y| \le R}\).如果点\(u\)和点\(v\)联通,点\(v\)和点\(k\)联通,则点\(u\)和点\(k\)联通。
\(1 \le Q,R,x,y \le 100,000\)
知识点: 线段树、并查集
解题思路:
易知每个点能到达的区域为一个对角线长度为\(2R\)的正菱形,我们可以通过将其旋转\(45^\circ \)来将其转换成正方形,具体的转化方法为
\(x' = x + y\)
\(y' = x - y\)
而该正方形的连通区域也转变成了\({(a',b'):|a'-x'|+|b'-y'| \le R}\).
具体证明:(参考(chao)自官方题解)
\(|x-a|+|y-b| = max(x-a+y-b, x-a+b-y, a-x+y-b, a-x+b-y) = max(|(x+y)-(a+b)|, |(x-y)-(a-b)|) = max(|x'-a'|, |y'-b'|) \le R\)
(转化的部分才是本题的精髓所在)
转化为正方形之后,对于坐标轴的 \(x\) 轴建立线段树,用\(set\)记录\(x\)在该区间中的中心点所对应\(y\)值及其指令编号。
添加的时候先查询一下在
\([x-2R,x] \times [y-2R,y], [x-2R,x] \times [y,y+2R], [x,x+2R] \times [y-2R, y], [x,2R] \times [y,y+2R] \)
这\(4\)个正方形区域中有没有点,如果有,则将各个区域中最靠近的点和要添加的点用并查集合并在一起。
询问的时候只需询问两个点是否并在一起了即可。
具体实现看代码及注释
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 const int maxn=,RR=;
typedef pair<int,int> P;
set<P> tree[maxn<<]; //(y值,第几次查询)
void update(int pos,int y,int q,int l,int r,int rt){//在pos点插入纵坐标为y,查询编号为q的点
tree[rt].insert(make_pair(y,q));
if(l==r) return;
int m=(l+r)>>;
if(pos<=m) update(pos,y,q,lson);
else update(pos,y,q,rson);
}
int query(int L,int R,int y,int aR,int l,int r,int rt){//查询[L,R]*[y,2*aR]的正方形区域
if(L<=l&&r<=R){
set<P>::iterator it=tree[rt].lower_bound(make_pair(y,)); //找出纵坐标大于或等于y的最小值
if(it != tree[rt].end() &&(it->first <= y+*aR)) return it->second; //返回对应的编号(从1开始)
return ;//否则返回0
}
int m=(l+r)>>;
int ret=;
if(L<=m) ret=max(ret,query(L,min(m,R),y,aR,lson));
if(R>m) ret=max(ret,query(max(L,m+),R,y,aR,rson));
return ret;
} //并查集部分
int par[maxn];
void init(int n){
for(int i=;i<=n;i++) par[i]=i;
}
int finds(int x){
if(par[x]==x) return x;
return par[x]=finds(par[x]);
}
void unite(int x,int y){
int tx=finds(x);
int ty=finds(y);
if(tx==ty) return;
par[tx]=ty;
}
//*******************************************************
int main(){
int Q,R,x,y;
char tmp[];
scanf("%d%d",&Q,&R);
init(Q);
for(int q=;q<=Q;q++){
scanf("%s %d %d",tmp,&x,&y);
int tx=x+y+*R,ty=x-y; //因为后面会查询到[tx-2*R,tx]这个区间,所以我们统一先将其加上2*R,避免出现负数,数组也要相应地开大一点
if(tmp[]=='+'){
int x1=query(tx-*R,tx,ty-*R,R,,maxn,);
int x2=query(tx-*R,tx,ty,R,,maxn,);
int x3=query(tx,tx+*R,ty-*R,R,,maxn,);
int x4=query(tx,tx+*R,ty,R,,maxn,);
if(x1) unite(x1,q);
if(x2) unite(x2,q);
if(x3) unite(x3,q);
if(x4) unite(x4,q);
update(tx,ty,q,,maxn,);
}
else{
if(finds(x)==finds(y)) printf("DA\n");
else printf("NET\n");
}
}
}
CodeChef - TELEPORT的更多相关文章
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
- 批量去除Teleport Pro整站下载文件冗余代码
teleport pro tppabs标签批量删除 teleport pro tppabs标签批量删除 使 用Teleport Pro下载的网页代码中包含了很多垃圾代码,比如下载的html网页代码中会 ...
- 【BZOJ4260】 Codechef REBXOR 可持久化Trie
看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...
- Teleport Ultra/Teleport Pro的冗余代码批量清理方法
Teleport Pro 是款优秀的网站离线浏览工具(即网站整站下载工具),Teleport Ultra是其增强版,但使用此系列软件下载的离线网页里会包含大量冗余代码(如tppabs),手动去修改工作 ...
- codechef 两题
前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...
- Gravitational Teleport 是一个先进的 SSH 服务器,基于 Golang SSH 构建,完全兼容 OpenSSH
Gravitational Teleport 是一个先进的 SSH 服务器,可通过 SSH 或者 HTTPS 远程访问 Linux 服务器.其目的是为了替代 sshd.Teleport 可以轻松让团队 ...
- codechef January Challenge 2014 Sereja and Graph
题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...
- BZOJ3509: [CodeChef] COUNTARI
3509: [CodeChef] COUNTARI Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 339 Solved: 85[Submit][St ...
- CodeChef CBAL
题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...
随机推荐
- Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转
问题引入 试想这样一个业务场景: 在用户输入数据,点击提交按钮后,这时发起了ajax请求,如果请求成功, 则跳转到详情页面并展示详情数据,失败则不跳转到详情页面,只是在当前页面给出错误消息. 难点所在 ...
- php数组存在重复的相反元素,去重复
$arr1=array('a_b','c_d','b_a','d_c'); $arr2=array('a_b','c_d','b_a','d_c'); 条件: a_b==b_a:c_d==d_c: 需 ...
- centos6.X修改ssh默认端口号
先查看下服务器端口号范围: # sysctl -a|grep ip_local_port_range net.ipv4.ip_local_port_range = 32768 61000 新ss ...
- Leo2DNT(雷傲论坛转DiscuzNT)1.0转换程序发布
数据转换程序 雷傲论坛(Leobbs4.x) -> Discuz!NT V1.0 本转换程序基于Leobbs4.x设计 声明: 1.本程序只对数据作转换,不会对原来的雷傲论坛(数据 ...
- Clickhosue 强大的函数,argMin() 和argMax()函数
说实话,我喜欢Clickhouse 的函数,简单操作,功能强大.今天需要给大家介绍两个函数,argMin(),argMax() 1.argMax():计算 ‘arg’ 最大值 ‘val’ 价值. 如果 ...
- Codeforce 1155D Beautiful Array(DP)
D. Beautiful Array You are given an array aa consisting of nn integers. Beauty of array is the maxim ...
- 自动化API之一 生成开源ERP Odoo App 的RestFul API
1.在服务器上安装开源ERP Odoo 安装步骤请自行百度,本文重点不在于指导安装,以下是安装后PC端效果. Odoo: 2.在Uniconnector平台上注册Odoo App 移动端应用 3.配置 ...
- E. Kamil and Making a Stream 区间gcd
E. Kamil and Making a Stream 这个题目要用到一个结论,就是区间一个区间长度为n的不同的gcd不会超过logn 个, 其实就是知道这个题目可以暴力就好了. 然后就是对于每一个 ...
- NetCore项目实战篇05---添加Ocelot网关并集成identity server4认证
今天来给我们的项目增加API网关,使用Ocelot. 它是系统暴露在外部的一个访问入口,这个有点像代理访问的家伙,就像一个公司的门卫承担着寻址.限制进入.安全检查.位置引导.等等功能.同时我们还要在网 ...
- Coursera课程笔记----C程序设计进阶----Week 3
函数的递归(Week 3) 什么是递归 引入 函数可以嵌套调用:无论嵌套多少层,原理都一样 函数不能嵌套定义:不能在一个函数里再定义另一个函数,因为所有函数一律平等 问题:一个函数能调用它自己吗? 举 ...