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[ ...
随机推荐
- 在IBM Cloud中运行Fabric
文章目录 打包智能合约 创建IBM Cloud services 创建fabric网络 创建org和相应的节点 创建order org和相应节点 创建和加入channel 导入智能合约 上篇文章我们讲 ...
- 【Linux常见命令】mkdir命令
mkdir - make directories 例子: mkdir /data 在根目录/下创建data文件夹(目录) 语法: mkdir [-p] dirName 参数说明: -p 确保目录名称存 ...
- JS代码规范
JS代码规范 空格 二元运算符两侧必须有一个空格,一元运算符与操作对象之间不允许有空格. var a = !arr.length; a++; a = b + c; 复制代码 用作代码块起始的左花括号 ...
- 如何迅速分析出系统CPU的瓶颈在哪里?
内容出自极客时间专栏<Linux 性能优化实战> CPU 的性能指标那么多,CPU 性能分析工具一抓一大把,换成实际的工作场景,该观察什么指标.选择哪个性能工具呢? 不要担心,今天我就以多 ...
- Linux下创建 code diff 和 合并 patch
Linux 下经常需要给别人提供 patch 以及合 patch,这时需要用到 Linux 的 diff 和 patch 命令. 1. diff 命令 diff 命令常用来比较文件.目录,也可以用来制 ...
- INTERVIEW #1
一.数据对齐存储 在32位系统中:int占4Bytes,short占2Bytes,char占1Byte,加起来应该是7Bytes,但是下面这段代码输出却是8. #define _CRT_SECURE_ ...
- 数学--数论-- HDU 2601 An easy problem(约束和)
Problem Description When Teddy was a child , he was always thinking about some simple math problems ...
- 请不要浪费你的生命,一文多发推广就用它(OpenWrite)
你我的共同困惑 你是否跟我一样?刚开始尝试写作,自己没有名气,有以下几个困惑: 想要推广自己,想在多个平台发文? 多平台发文之后,想要看各个平台的流量如何? 有了流量,想要引流用户到自己的网站? 网站 ...
- UML笔记之类图
1.类与类之间关系在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合( ...
- [计算机视觉]从零开始构建一个微软how-old.net服务/面部属性识别
大概两三年前微软发布了一个基于Cognitive Service API的how-old.net网站,用户可以上传一张包含人脸的照片,后台通过调用深度学习算法可以预测照片中的人脸.年龄以及性别,然后将 ...