Gym - 101955E The Kouga Ninja Scrolls (曼哈顿距离变换+线段树)
题意:有n个忍者(编号为1-n),每个忍者有三个属性:横坐标x,纵坐标y,所属门派c,要求支持三种操作:
1.改变第k个忍者的位置
2.改变第k个忍者的门派
3.查询编号为[l,r]之间的忍者中,所属门派不同的两个忍者的最大曼哈顿距离
通过曼哈顿距离变换,将每个忍者的横坐标和纵坐标拆成x+y和x-y,两种情况分别用线段树维护区间最大值,最小值,最大值和最小值所属门派,以及门派不同的次大值及次小值(非严格),查询时分两种情况:
1.最大值和最小值门派不同:答案为最大值-最小值
2.最大值和最小值门派相同:答案为max(最大值-次小值,次大值-最小值)
两种情况分别讨论一下,然后取个最大值即可。
无解的情况需要特判一下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+,inf=0x3f3f3f3f3f3f3f3fll;
ll n,m,X[N],Y[N],C[N],ka;
struct D {ll mx,smx,mi,smi,umx,umi;} tr[N<<][];
D operator+(const D& a,const D& b) {
if(a.mx==~inf)return b;
if(b.mx==~inf)return a;
D c;
c.mx=max(a.mx,b.mx);
c.mi=min(a.mi,b.mi);
c.umx=c.mx==a.mx?a.umx:b.umx;
c.smx=max(a.smx,b.smx);
if(a.umx!=b.umx)c.smx=max(c.smx,min(a.mx,b.mx));
c.umi=c.mi==a.mi?a.umi:b.umi;
c.smi=min(a.smi,b.smi);
if(a.umi!=b.umi)c.smi=min(c.smi,max(a.mi,b.mi));
return c;
}
#define ls (u<<1)
#define rs (u<<1|1)
#define mid ((l+r)>>1)
void pu(ll u) {tr[u][]=tr[ls][]+tr[rs][],tr[u][]=tr[ls][]+tr[rs][];}
void build(ll u=,ll l=,ll r=n) {
if(l==r) {
tr[u][]= {X[l]+Y[l],~inf,X[l]+Y[l],inf,C[l],C[l]};
tr[u][]= {X[l]-Y[l],~inf,X[l]-Y[l],inf,C[l],C[l]};
return;
}
build(ls,l,mid),build(rs,mid+,r),pu(u);
}
void upd(ll p,ll x,ll y,ll c,ll u=,ll l=,ll r=n) {
if(l==r) {
tr[u][]= {x+y,~inf,x+y,inf,c,c};
tr[u][]= {x-y,~inf,x-y,inf,c,c};
return;
}
p<=mid?upd(p,x,y,c,ls,l,mid):upd(p,x,y,c,rs,mid+,r);
pu(u);
}
D qry(ll L,ll R,ll f,ll u=,ll l=,ll r=n) {
if(l>=L&&r<=R)return tr[u][f];
if(l>R||r<L)return {~inf};
return qry(L,R,f,ls,l,mid)+qry(L,R,f,rs,mid+,r);
}
int main() {
ll T;
for(scanf("%lld",&T); T--;) {
printf("Case #%lld:\n",++ka);
scanf("%lld%lld",&n,&m);
for(ll i=; i<=n; ++i)scanf("%lld%lld%lld",&X[i],&Y[i],&C[i]);
build();
while(m--) {
ll f,l,r,k,c,x,y;
scanf("%lld",&f);
if(f==)scanf("%lld%lld%lld",&k,&x,&y),upd(k,X[k]+=x,Y[k]+=y,C[k]);
else if(f==)scanf("%lld%lld",&k,&c),upd(k,X[k],Y[k],C[k]=c);
else if(f==) {
scanf("%lld%lld",&l,&r);
D a=qry(l,r,),b=qry(l,r,);
ll x=a.umx==a.umi?max(a.mx-a.smi,a.smx-a.mi):a.mx-a.mi;
ll y=b.umx==b.umi?max(b.mx-b.smi,b.smx-b.mi):b.mx-b.mi;
printf("%lld\n",a.smx==~inf?:max(x,y));
}
}
}
return ;
}
Gym - 101955E The Kouga Ninja Scrolls (曼哈顿距离变换+线段树)的更多相关文章
- gym/101955/problem/E - The Kouga Ninja Scrolls 线段数 维护 切比雪夫距离 2018沈阳icpc
传送门 思路: 这道题要把给定的每个坐标利用切比雪夫坐标表示,这样两个点的距离就是max(dx,dy),而不是一开始的dx + dy,有利于线段树的维护,又由于询问的是区间的最大差值,限制是两个点是属 ...
- ACM-ICPC 2018 沈阳赛区现场赛 E. The Kouga Ninja Scrolls (切比雪夫距离+线段树)
题目链接: 题意:在二维平面上有 n 个人,每个人有一个位置(xi, yi)和门派 ci,m 个操作:①改变第 k 个人的位置:②改变第 k 个人的门派:③询问区间[l,r]之间不同门派的两个人的最大 ...
- HDU - 6435 Problem J. CSGO (曼哈顿距离变换)
题目大意:有两类武器(主武器和副武器),每类有若干把,每把武器都有一个基础属性S,以及k个附加属性,让你选一把主武器M和一把副武器S,使得最大. 显然后面的和式是一个k维的曼哈顿距离,带绝对值符号不好 ...
- XMU 1607 nc与点对距离 【线段树】
1607: nc与点对距离 Time Limit: 5000 MS Memory Limit: 512 MBSubmit: 60 Solved: 8[Submit][Status][Web Boa ...
- Hdu4311 || 4312Meeting point-1/-2 n个点中任意选一个点使得其余点到该点曼哈顿距离之和最小
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- Atitti knn实现的具体四个距离算法 欧氏距离、余弦距离、汉明距离、曼哈顿距离
Atitti knn实现的具体四个距离算法 欧氏距离.余弦距离.汉明距离.曼哈顿距离 1. Knn算法实质就是相似度的关系1 1.1. 文本相似度计算在信息检索.数据挖掘.机器翻译.文档复制检测等领 ...
- 【POJ 3241】Object Clustering 曼哈顿距离最小生成树
http://poj.org/problem?id=3241 曼哈顿距离最小生成树模板题. 核心思想是把坐标系转3次,以及以横坐标为第一关键字,纵坐标为第二关键字排序后,从后往前扫.扫完一个点就把它插 ...
- 【HDU 4311】Meeting point-1(前缀和求曼哈顿距离和)
题目链接 正经解法: 给定n个点的坐标,找一个点,到其他点的曼哈顿距离之和最小.n可以是100000.大概要一个O(nlogn)的算法.算曼哈顿距离可以把x和y分开计算排好序后计算前缀和就可以在O(1 ...
- hdu4666 Hyperspace ——曼哈顿距离
link:http://acm.hdu.edu.cn/showproblem.php?pid=4666 这题学会了怎么处理曼哈顿距离. 比如维数是k,那么每个点有2^k个状态,求出在每个状态下,所有点 ...
随机推荐
- 函数节流之debounce
浏览器中某些计算和处理要比其他的昂贵很多.例如, DOM 操作比起非 DOM 交互需要更多的内存和 CPU 时间.连续尝试进行过多的 DOM 相关操作可能会导致浏览器挂起,有时候甚至会崩溃.尤其在 I ...
- [转帖]yum与apt-get的区别以及两者更新源(阿里/网易【163】)
yum与apt-get的区别以及两者更新源(阿里/网易[163]) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/one_super_dreamer ...
- [转帖]英特尔首款采用10nm技术的混合CPU“Lakefield”即将发布
英特尔首款采用10nm技术的混合CPU“Lakefield”即将发布 intel 也出soc了 里面的东西 跟 安卓和 apple的a系列很像. https://baijiahao.baidu.com ...
- ArrayList类的set()方法
ArrayList类的set()方法用于更新指定位置的内容,若内容是new出来的,则需要调用该set()方法:否则,不需要调用该set()方法,示例如下 User.java public class ...
- Python 基础(十七)--序列化
pickle模快 pickle.dumps():可将特有数据类型的转换为bytes类型 pickle.loads():将bytes类型转化回来 >>> import pickle & ...
- kdress学习
这两天看了一本书叫<linux二进制分析>,这里面提到的一个小工具kdress,这里分析一下 源码在:https://github.com/elfmaster/kdress kdress介 ...
- 代码优化:Java编码技巧之高效代码50例
出处: Java编码技巧之高效代码50例 1.常量&变量 1.1.直接赋值常量值,禁止声明新对象 直接赋值常量值,只是创建了一个对象引用,而这个对象引用指向常量值. 反例: Long i = ...
- T100——上传图片
例子可参考aooi100,上传集团logo的程序 ON ACTION btn_updatelogo #選取上傳檔案,GDC專用 LET gs_upload = NULL CALL cl_client_ ...
- THUWC2020滚粗记
\(Day-?\) 教练叫走了3个人,没叫我 感觉药丸,然后被告知pku没过,thu过了 神奇,然后就活了 后来在机房颓废,大声说笑被diss 当时感觉颓的有点过头,药丸 \(Day0\) 跟NC去T ...
- 【IntelliJ IDEA】快捷键
1.System.out.println();的快捷方法 sout然后Alt+Enter或者直接点 2.idea上 重写父类方法的快捷键 Ctrl+O之后,在弹出的上面选择要重写的方法 3.idea ...