题意:有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. Git--上手Github

    1.创建远程仓库 无论在之后的第二步你是想从本地到远程还是远程到本地,创建远程仓库是第一步肯定的.(推荐克隆本地,然后把本地的代码拷入,然后add push) 因为clone ,github会帮忙创建 ...

  2. 简单实现JDBC自动加载驱动,简化数据连接和关闭数据库连接

    package util; import java.io.File;import java.io.FileInputStream;import java.io.IOException;import j ...

  3. 编译错误ERROR C2027

    一个工程编译时出错! 费了很多时间,增加头文件都不可取,然后把source File文件下分的.cpp文件删除,然后编译通过.

  4. thinkPHP连接数据库报错:PDOException in Connection.php line 295

    跑去网上找了N多方法来尝试,重装apache.mysql.安装集成软件都试过了.错误一样. 后来细细分析,PDOException in Connection指的不就是PDO异常吗? 然后去了解了一些 ...

  5. Unknown custom element: <swiper>

    刚开始使用VUE,一直提示这个,后来才发现是注册组件时注册反了:先新建VUE实例再注册组件是问题根源,调转一下顺序即可解决

  6. 搞懂Dubbo服务发布与服务注册

    一.前言 本文讲服务发布与服务注册,服务提供者本地发布服务,然后向注册中心注册服务,将服务实现类以服务接口的形式提供出去,以便服务消费者从注册中心查阅并调用服务. 本文源码分析基于org.apache ...

  7. C#实现鼠标滚筒缩放界面的效果

    elementCanvas继承UserControl 声明属性: #region 缩放属性添加 float ratio = 1.0f; public float Ratio { set { ratio ...

  8. JS基础_打印出1-100之间所有的质数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. JS基础_if语句

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. JavaScript例子1-给网页中所有<p>元素添加onclick事件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...