题意:有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 (曼哈顿距离变换+线段树)的更多相关文章

  1. gym/101955/problem/E - The Kouga Ninja Scrolls 线段数 维护 切比雪夫距离 2018沈阳icpc

    传送门 思路: 这道题要把给定的每个坐标利用切比雪夫坐标表示,这样两个点的距离就是max(dx,dy),而不是一开始的dx + dy,有利于线段树的维护,又由于询问的是区间的最大差值,限制是两个点是属 ...

  2. ACM-ICPC 2018 沈阳赛区现场赛 E. The Kouga Ninja Scrolls (切比雪夫距离+线段树)

    题目链接: 题意:在二维平面上有 n 个人,每个人有一个位置(xi, yi)和门派 ci,m 个操作:①改变第 k 个人的位置:②改变第 k 个人的门派:③询问区间[l,r]之间不同门派的两个人的最大 ...

  3. HDU - 6435 Problem J. CSGO (曼哈顿距离变换)

    题目大意:有两类武器(主武器和副武器),每类有若干把,每把武器都有一个基础属性S,以及k个附加属性,让你选一把主武器M和一把副武器S,使得最大. 显然后面的和式是一个k维的曼哈顿距离,带绝对值符号不好 ...

  4. XMU 1607 nc与点对距离 【线段树】

    1607: nc与点对距离 Time Limit: 5000 MS  Memory Limit: 512 MBSubmit: 60  Solved: 8[Submit][Status][Web Boa ...

  5. Hdu4311 || 4312Meeting point-1/-2 n个点中任意选一个点使得其余点到该点曼哈顿距离之和最小

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  6. Atitti knn实现的具体四个距离算法 欧氏距离、余弦距离、汉明距离、曼哈顿距离

    Atitti knn实现的具体四个距离算法  欧氏距离.余弦距离.汉明距离.曼哈顿距离 1. Knn算法实质就是相似度的关系1 1.1. 文本相似度计算在信息检索.数据挖掘.机器翻译.文档复制检测等领 ...

  7. 【POJ 3241】Object Clustering 曼哈顿距离最小生成树

    http://poj.org/problem?id=3241 曼哈顿距离最小生成树模板题. 核心思想是把坐标系转3次,以及以横坐标为第一关键字,纵坐标为第二关键字排序后,从后往前扫.扫完一个点就把它插 ...

  8. 【HDU 4311】Meeting point-1(前缀和求曼哈顿距离和)

    题目链接 正经解法: 给定n个点的坐标,找一个点,到其他点的曼哈顿距离之和最小.n可以是100000.大概要一个O(nlogn)的算法.算曼哈顿距离可以把x和y分开计算排好序后计算前缀和就可以在O(1 ...

  9. hdu4666 Hyperspace ——曼哈顿距离

    link:http://acm.hdu.edu.cn/showproblem.php?pid=4666 这题学会了怎么处理曼哈顿距离. 比如维数是k,那么每个点有2^k个状态,求出在每个状态下,所有点 ...

随机推荐

  1. char、varchar、nchar、nvarchar四种类型

    char,nchar是定长,如果没达到指定的长度时将自动以英文空格在其后面填充.优势在于速度较高.varchar,nvarchar属于变长,如果没有达到指定的长度时,不会将自动以英文空格在其后面填充. ...

  2. 使用nfsstat命令查看NFS服务器状态

    转载于:http://www.cnblogs.com/jankie/archive/2011/09/03/2165851.html nfsstat命令显示关于NFS和到内核的远程过程调用(RPC)接口 ...

  3. [转帖]安装prometheus+grafana监控mysql redis kubernetes等

    安装prometheus+grafana监控mysql redis kubernetes等 https://www.cnblogs.com/sfnz/p/6566951.html plug 的模式进行 ...

  4. centos7安装oracle1201c

    root身份安装依赖包: yum -y install binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*.i686 el ...

  5. kubectl相关指令

    在列出.描述.修改或删除其他命名空间中的对象时,需要给kubect1命令传递--namespace(或-n)选项.如果不指定命名空间,kubect1将在当前上下文中配置的默认命名空间中执行操作.而当前 ...

  6. STL stack 常见用法详解

    <算法笔记>学习笔记 stack 常见用法详解 stack翻译为栈,是STL中实现的一个后进先出的容器.' 1.stack的定义 //要使用stack,应先添加头文件#include &l ...

  7. Photon Server初识(二) ---通过NHibernate 映射数据库

    一.下载 NHibernate.dill 官网:https://nhibernate.info 或者通过NuGet下载(详情看上一节) 二.新建一个项目,并引入包 引入包 三.配置(重点) 1.配置x ...

  8. Python—None

    None是一个特殊的常量. None不是False. None不是0. None不是空字符串. None有自己的数据类型NoneType,并且是NoneType中唯一的值. None只是一个空值的对象 ...

  9. C语言写郑州大学校友通讯录

    #include <stdio.h> #include <string.h> #include <stdlib.h> #define LEN sizeof(stru ...

  10. ptf转图片

    1.spire 官方的有水印,通过引用 //private readonly static PdfDocument doc = new PdfDocument(); //public static S ...