题目链接:http://codeforces.com/gym/101955/problem/E

题意:

二维坐标上给你1e5个人,并且给你这些人分别所属的阵营,现在你有三种操作。

1 k x y: 表示你要将第k个人的坐标增加(x,y),即变成(x0+x,y0+y),(原来在x0,y0上)。

2 k c: 表示将第k个人的阵营进行改变,变为c

3 l  r :表示询问第l个人到第r个人之间,处于不同阵营的最远曼哈顿距离。

做法:

首先,我们需要知道一个叫切比雪夫距离的东西,简单说就是两个点(x1,y1),(x2,y2)之间的距离=max(abs(x1-x2),abs(y1-y2)),并且我们要知道这个东西是可以和曼哈顿距离相互转化的东西。即原坐标中的(x,y)在新坐标系中变为(x+y,x-y),就可以直接用切比雪夫距离来表示曼哈顿距离,至于为什么呢,因为曼哈顿距离=abs(x1-x2)+abs(y1-y2),假设这两个绝对值里面出来的都是同号(即x1>x2,y1>y2或者x1<x2,y1<x2),那么就是等于x1+y1-(x2+y2),或者x2+y2-(x1+y1),那么就是新坐标中的两个新的Xnew值相减,两个绝对值中为异号则是看y,所以我们在新坐标中取x差和y的差的最大值。

如果还是不是很懂的话就戳 https://www.cnblogs.com/zwfymqz/p/8253530.html?tdsourcetag=s_pctim_aiomsg  ,感觉讲的应该很彻底了,还有把切比雪夫距离转换成曼哈顿距离的。

在知道了这样的规律之后,那么我们就可以用x和y去做曼哈顿距离,就可以用线段树进行区间x值和y值的最大值和最小值的维护,但这里有个问题,就是可能我们的最大值和最小值都是同一个阵营的,这样的话就会找不到答案,所以我们在线段树里要维护一个最大值最小值还有一个次大值和次小值,注意一定要保证次大值和最大值是阵营是不一样的(因为同一个阵营的话距离就没意义了,所以需要不同阵营),每次查询的时候要看最大值和最小值,次大和最小,最大和次小值的最大差(在保证阵营的前提下),次大和次小其实应该没必要去查询。

总的来说就是线段树要维护8个pair,代码真是极其难敲...bug还de了好久。下面代码里也写了点注释..加油叭= =.


#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
#define fi first
#define se second
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const ll inf=1e16;typedef pair<ll,int> pii;ll x[maxn],px[maxn],y[maxn],py[maxn],c[maxn];
pii xmax[maxn<<2][2],xmin[maxn<<2][2];
pii ymax[maxn<<2][2],ymin[maxn<<2][2];
//0表示最值 1表示次值
//first是val second是阵营int n,m;
void fresh(pii aim[][2],pii tmp[],int rt,int f){if(f){//最大值的更新aim[rt][0]={-inf,0},aim[rt][1]={-inf,0};for(int i=0;i<4;i++){if(tmp[i].fi>aim[rt][0].fi&&tmp[i].se){aim[rt][0]=tmp[i];}}for(int i=0;i<4;i++){if(tmp[i].fi>aim[rt][1].fi&&tmp[i].se!=aim[rt][0].se){aim[rt][1]=tmp[i];}}}else{//最小值的更新aim[rt][0]={inf,0},aim[rt][1]={inf,0};for(int i=0;i<4;i++){if(tmp[i].fi<aim[rt][0].fi&&tmp[i].se){aim[rt][0]=tmp[i];}}for(int i=0;i<4;i++){if(tmp[i].fi<aim[rt][1].fi&&tmp[i].se!=aim[rt][0].se){aim[rt][1]=tmp[i];}}}
}
void push_up(int rt){pii tmp[4];tmp[0]=xmax[lson][0],tmp[1]=xmax[rson][0],tmp[2]=xmax[lson][1],tmp[3]=xmax[rson][1];fresh(xmax,tmp,rt,1);tmp[0]=ymax[lson][0],tmp[1]=ymax[rson][0],tmp[2]=ymax[lson][1],tmp[3]=ymax[rson][1];fresh(ymax,tmp,rt,1);tmp[0]=xmin[lson][0],tmp[1]=xmin[rson][0],tmp[2]=xmin[lson][1],tmp[3]=xmin[rson][1];fresh(xmin,tmp,rt,0);tmp[0]=ymin[lson][0],tmp[1]=ymin[rson][0],tmp[2]=ymin[lson][1],tmp[3]=ymin[rson][1];fresh(ymin,tmp,rt,0);
}
void build(int l,int r,int rt){if(l==r){xmax[rt][0]={x[l],c[l]}; xmax[rt][1]={-inf,0};xmin[rt][0]={x[l],c[l]}; xmin[rt][1]={inf,0};ymax[rt][0]={y[l],c[l]}; ymax[rt][1]={-inf,0};ymin[rt][0]={y[l],c[l]}; ymin[rt][1]={inf,0};return ;}int mid=(r+l)/2;build(l,mid,lson);build(mid+1,r,rson);push_up(rt);
}
void update(int l,int r,int rt,int pos){if(l==r){xmax[rt][0]={x[l],c[l]}; xmax[rt][1]={-inf,0};xmin[rt][0]={x[l],c[l]}; xmin[rt][1]={inf,0};ymax[rt][0]={y[l],c[l]}; ymax[rt][1]={-inf,0};ymin[rt][0]={y[l],c[l]}; ymin[rt][1]={inf,0};return ;}int mid=(r+l)/2;if(pos<=mid) update(l,mid,lson,pos);else if(pos>mid) update(mid+1,r,rson,pos);push_up(rt);
}
void deal(pii big,pii sma,ll &change){if(big.se!=sma.se&&big.se!=0&&sma.se!=0){change=max(change,(ll)(big.fi-sma.fi));}
}
void query(int l,int r,int rt,int ql,int qr,pii &big0,pii &big1,pii &sma0,pii &sma1,int flag){if(ql<=l&&r<=qr){if(flag){//查询xif(big0.fi<xmax[rt][0].fi) {//保证在新的阵营和旧的阵营不同的时候//才能把原来的最大值变成次大值if(xmax[rt][0].se!=big0.se) big1=big0;big0=xmax[rt][0];}for(int i=0;i<2;i++){if(big1.fi<xmax[rt][i].fi&&xmax[rt][i].se!=big0.se) {big1=xmax[rt][i];}}if(sma0.fi>xmin[rt][0].fi) {if(xmin[rt][0].se!=sma0.se) sma1=sma0;sma0=xmin[rt][0];}for(int i=0;i<2;i++){if(sma1.fi>xmin[rt][i].fi&&xmin[rt][i].se!=sma0.se) {sma1=xmin[rt][i];}}}else{if(big0.fi<ymax[rt][0].fi) {if(ymax[rt][0].se!=big0.se) big1=big0;big0=ymax[rt][0];}for(int i=0;i<2;i++){if(big1.fi<ymax[rt][i].fi&&ymax[rt][i].se!=big0.se) {big1=ymax[rt][i];}}if(sma0.fi>ymin[rt][0].fi) {if(ymin[rt][0].se!=sma0.se) sma1=sma0;sma0=ymin[rt][0];}for(int i=0;i<2;i++){if(sma1.fi>ymin[rt][i].fi&&ymin[rt][i].se!=sma0.se) {sma1=ymin[rt][i];}}}return ;}int mid=(r+l)/2;if(ql<=mid) query(l,mid,lson,ql,qr,big0,big1,sma0,sma1,flag);if(qr>mid) query(mid+1,r,rson,ql,qr,big0,big1,sma0,sma1,flag);
}
int main(){int T,cas=0; scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);rep(i,1,n){scanf("%lld%lld%lld",&px[i],&py[i],&c[i]);x[i]=px[i]+py[i],y[i]=px[i]-py[i];}build(1,n,1);printf("Case #%d:\n",++cas);rep(i,1,m){int op,ind,l,r,cc;ll xx,yy;scanf("%d",&op);if(op==1){scanf("%d%lld%lld",&ind,&xx,&yy);px[ind]+=xx,py[ind]+=yy;x[ind]=px[ind]+py[ind],y[ind]=px[ind]-py[ind];update(1,n,1,ind);}if(op==2){scanf("%d%d",&ind,&cc);c[ind]=cc;update(1,n,1,ind);}if(op==3){scanf("%d%d",&l,&r);ll ansx=0,ansy=0;pii big0={-inf,0},big1={-inf,0},sma1={inf,0},sma0={inf,0};query(1,n,1,l,r,big0,big1,sma0,sma1,1);deal(big0,sma0,ansx);deal(big1,sma0,ansx);deal(big0,sma1,ansx);deal(big1,sma1,ansx);big0={-inf,0},big1={-inf,0},sma1={inf,0},sma0={inf,0};query(1,n,1,l,r,big0,big1,sma0,sma1,0);deal(big0,sma0,ansy);deal(big1,sma0,ansy);deal(big0,sma1,ansy);deal(big1,sma1,ansy);printf("%lld\n",max(ansx,ansy));}}}return  0;
}
/*
10
4 10
1 1 3
5 1 1
2 5 2
4 4 13 2 4
1 4 3 4
3 2 43 1 3
1 1 1 3
3 1 33 3 4
2 3 1
3 3 4*/

2018-2019 ACM-ICPC, Asia Shenyang Regional Contest E. The Kouga Ninja Scrolls 不容易的线段树 切比雪夫距离相关推荐

  1. 2018-2019 ACM-ICPC, Asia Shenyang Regional Contest E. The Kouga Ninja Scrolls 切比雪夫距离 +线段树

    传送门 将曼哈顿距离转换成切比雪夫距离,现在就是求max(∣x1−x2∣,∣y1−y2∣)max(|x_1-x_2|,|y_1-y_2|)max(∣x1​−x2​∣,∣y1​−y2​∣),显然我们可以 ...

  2. 2017 ACM ICPC Asia Shenyang Regional Contest 题解(10 / 13)【每日亿题2 / 16】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2017 ICPC shenyang I)Little Boxes B.(2017 ICP ...

  3. 2016 ACM / ICPC Asia dalian Regional Contest 题解(11 / 11)【每日亿题2021 / 2 / 17】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A .(2017 ACM ICPC dalian H)To begin or not to be ...

  4. The 2019 ICPC Asia Shanghai Regional Contest

    The 2019 ICPC Asia Shanghai Regional Contest 题号 题目 知识点 A Mr. Panda and Dominoes B Prefix Code C Maze ...

  5. 2018 ICPC Asia Jakarta Regional Contest

    2018 ICPC Asia Jakarta Regional Contest 题号 题目 知识点 难度 A Edit Distance B Rotating Gear C Smart Thief D ...

  6. The 2020 ICPC Asia Shenyang Regional Programming Contest I题 Rise of Shadows(数论)

    题目链接The 2020 ICPC Asia Shenyang Regional Programming Contest 题目大意: 一天内有H小时,每小时M分钟,时针分针以恒定速率旋转. 现在若时针 ...

  7. 【题目记录】——The 2021 ICPC Asia Jinan Regional Contest

    文章目录 C Optimal Strategy 组合数 H Game Coin K Search For Mafuyu 欧拉序列 题目集地址 The 2021 ICPC Asia Jinan Regi ...

  8. 2018 ACM-ICPC Asia Shenyang Regional Contest 题解(9 / 13)【每日亿题2021/2/24】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2018 ACM-ICPC Shenyang J)How Much Memory Your ...

  9. 2019-2020 ICPC Asia Xuzhou Regional Contest【徐州现场赛】

    题目: 209-2020 ICPC Asia Xuzhou Regional Onsite Contest E. Multiply 题意: 找到最大的 i 使得 z*x^i 是 y! 的因子 分析: ...

最新文章

  1. 3D演示帮你一眼看懂线性规划问题,这篇可视化教程火了
  2. Mule ESB 3.3与CloudHub
  3. python打怪之路【第二篇】:ImportError: No module named setuptools
  4. 洛谷 P1308/暂无题解
  5. Java中如何引用文档对象模型_在JAVA中使用文档对象模型DOM经验小结
  6. arm芯片厂家排名_国产芯片目前至少有10种,其中有3种,达到了世界顶尖水平
  7. Node.js 多版本安装配置(Window、Ubuntu 、CentOS 、Mac OS、Cloud Studio)
  8. 格力电器Java面试题_JAVA设计模式学习--工厂模式
  9. Springboot系列之Shiro、JWT、Redis 进行认证鉴权
  10. 程序员必须尽早作打算
  11. 信息学奥赛一本通 1958:【12NOIP普及组】寻宝 | OpenJudge NOI 1.12 06 | 洛谷 P1076 [NOIP2012 普及组] 寻宝
  12. [Ext JS 4] MVC 应用程序框架
  13. 算法导论 练习12.2
  14. oracle共享内存不足,Oracle数据库共享内存分配不足怎么办
  15. zabbix通过jmx监控tomcat
  16. 559. N叉树的最大深度
  17. Oracle 集群sysbackup用户登陆随机报错ORA-01017
  18. Photoshop选区选取详解
  19. 前端网页生成二维码方法
  20. Python核心编程读书笔记

热门文章

  1. P2550数组彩票摇奖
  2. UG NX 12 点构造器
  3. 测试ResNet在ImageNet验证集上的准确率
  4. oracle erp云服务器配置,cloud介绍相关现代erp云解决方案- oracle erp cloud.pdf
  5. 03-盒子模型与元素显示类型
  6. 3GPP TS 29244-g30 中英文对照 | 5.4.5 DL Flow Level Marking for Application Detection
  7. 谈谈个人价值及平台红利
  8. 2019春季学期总结
  9. 流媒体协议初探(MPEG2-TS、RTSP、RTP、RTCP、SDP、RTMP、HLS、HDS、HSS、MPEG-DASH)
  10. 大数据[博学谷IT技术支持]