传送门
将曼哈顿距离转换成切比雪夫距离,现在就是求max(∣x1−x2∣,∣y1−y2∣)max(|x_1-x_2|,|y_1-y_2|)max(∣x1​−x2​∣,∣y1​−y2​∣),显然我们可以将x,yx,yx,y分开考虑,下面以xxx为例。

考虑一段区间内不同门派的最大值和最小值,我们可以维护这个区间的最大值和最小值,以及与最大值门派不同的次大值和与最小值门派不同的次小值,这样就不难得出答案了。

#include<bits/stdc++.h>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define Mid (tr[u].l+tr[u].r>>1)
#define pb push_back
using namespace std;const int N=1000010,INF=0x3f3f3f3f,mod=1e9+7;
typedef long long LL;int n,m;
int a[N],x[N],y[N],z[N];/*
最大值  与最大值门派不同的次大值
最小值  与最小值门派不同的次小值
*/
struct Point {LL val,id;
};
vector<Point>v;bool cmp1(Point a,Point b) {return a.val>b.val;
}bool cmp2(Point a,Point b) {return a.val<b.val;
}struct Seg {struct Node {int l,r;LL maxid[2],minid[2];LL maxval[2],minval[2];}tr[N<<2];void update(Node &u,Node ls,Node rs) {//最大值if(ls.maxval[0]>rs.maxval[0]) swap(ls,rs);u.maxval[0]=rs.maxval[0];u.maxid[0]=rs.maxid[0];//次大值v.clear();v.push_back({ls.maxval[0],ls.maxid[0]});v.push_back({ls.maxval[1],ls.maxid[1]});v.push_back({rs.maxval[1],rs.maxid[1]});sort(v.begin(),v.end(),cmp1);u.maxval[1]=-1e9-1;u.maxid[1]=0;for(auto x:v) if(x.id!=u.maxid[0]&&x.id!=0) {u.maxval[1]=x.val;u.maxid[1]=x.id;break;}//最小值if(ls.minval[0]<rs.minval[0]) swap(ls,rs);u.minval[0]=rs.minval[0];u.minid[0]=rs.minid[0];//次小值v.clear();v.push_back({ls.minval[0],ls.minid[0]});v.push_back({ls.minval[1],ls.minid[1]});v.push_back({rs.minval[1],rs.minid[1]});sort(v.begin(),v.end(),cmp2);u.minval[1]=1e9+1;u.minid[1]=0;for(auto x:v) if(x.id!=u.minid[0]&&x.id!=0) {u.minval[1]=x.val;u.minid[1]=x.id;break;}}void pushup(int u) {update(tr[u],tr[L],tr[R]);}void build(int u,int l,int r) {tr[u]={l,r};if(l==r) {tr[u].maxid[0]=tr[u].minid[0]=z[l];tr[u].maxid[1]=tr[u].minid[1]=0;tr[u].maxval[0]=tr[u].minval[0]=a[l];tr[u].maxval[1]=-1e9-1;tr[u].minval[1]=1e9+1;return;}build(L,l,Mid); build(R,Mid+1,r);pushup(u);}void change_val(int u,int pos,int val) {if(tr[u].l==tr[u].r) {tr[u].maxval[0]+=val;tr[u].minval[0]+=val;return;}if(pos<=Mid) change_val(L,pos,val);else change_val(R,pos,val);pushup(u);}void change_id(int u,int pos,int val) {if(tr[u].l==tr[u].r) {tr[u].maxid[0]=val;tr[u].minid[0]=val;return;}if(pos<=Mid) change_id(L,pos,val);else change_id(R,pos,val);pushup(u);}Node query(int u,int l,int r) {if(tr[u].l>=l&&tr[u].r<=r) return tr[u];if(r<=Mid) return query(L,l,r);else if(l>Mid) return query(R,l,r);else {Node ans,ls,rs;ls=query(L,l,r); rs=query(R,l,r);update(ans,ls,rs);return ans;}}LL get_ans(int l,int r) {Node u=query(1,l,r);LL ans=0;for(int i=0;i<2;i++) {for(int j=0;j<2;j++) {if(u.maxid[i]!=u.minid[j]&&u.maxid[i]!=0&&u.minid[j]!=0) {ans=max(ans,abs(u.maxval[i]-u.minval[j]));}}}return ans;}
}seg[2];void solve() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d%d%d",&x[i],&y[i],&z[i]);for(int i=1;i<=n;i++) a[i]=x[i]+y[i];seg[0].build(1,1,n);for(int i=1;i<=n;i++) a[i]=x[i]-y[i];seg[1].build(1,1,n);while(m--) {int op; scanf("%d",&op);if(op==1) {int k,x,y;scanf("%d%d%d",&k,&x,&y);seg[0].change_val(1,k,x+y);seg[1].change_val(1,k,x-y);} else if(op==2) {int k,c;scanf("%d%d",&k,&c);seg[0].change_id(1,k,c);seg[1].change_id(1,k,c);} else {int l,r; scanf("%d%d",&l,&r);printf("%lld\n",max(seg[0].get_ans(l,r),seg[1].get_ans(l,r)));}}
}int main() {int _; scanf("%d",&_);for(int i=1;i<=_;i++) {printf("Case #%d:\n",i);solve();}return 0;
}
/*
1
2 1
1 1 1
1 1 2
3 1 26 2
hahaha
*/

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 不容易的线段树 切比雪夫距离

    题目链接:http://codeforces.com/gym/101955/problem/E 题意: 二维坐标上给你1e5个人,并且给你这些人分别所属的阵营,现在你有三种操作. 1 k x y: 表 ...

  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. 2019 ICPC Asia Nanchang Regional K.Tree 树上启发式合并 + 动态开点线段树

    传送门 文章目录 题意: 思路: 题意: 给你一棵树,每个点都有一个权值valvalval,求满足以下条件 (1)x!=yx!=yx!=y (2)xxx和yyy不互为祖先 (3)val[lca(x,y ...

  5. The 2019 ICPC Asia Shanghai Regional Contest

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

  6. 2018 ICPC Asia Jakarta Regional Contest

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

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

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

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

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

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

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

最新文章

  1. mysql导入数据io异常_mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结
  2. 开关电源过流保护-打嗝模式
  3. 124. Binary Tree Maximum Path Sum 二叉树中的最大路径和
  4. 服务自动拉起,定时日志清理,数据统计的shell脚本
  5. 《电子元器件的可靠性》——3.3节可靠性筛选试验
  6. 服务器频繁重启怎么解决
  7. matlab读取sgy格式文件的m文件,matlab读取segy格式的文件
  8. C盘hiberfil.sys文件可以删除吗?法2(推荐)
  9. FC光钎通道交换机,同行性价比超高
  10. 一文了解滴滴与蚂蚁金服开源共建的SQLFlow
  11. Windows XP中的命令行界面
  12. MATLAB app designer GUI设计
  13. 千梦网创108计第三十六计:当地人才招聘网,一个年入50W的战友实操案例
  14. 4.5 GPO的编辑
  15. 电脑右下角网络图标有个红叉但是可以上网
  16. 什么是SAP Cloud Platform(SAP云平台) ?
  17. java可视化图表_8个华丽而实用的Java图表应用
  18. Java简繁体转换分享
  19. 使用nmcli配置主备模式链路聚合(team端口绑定)
  20. 前端练习41 数组的空位填充

热门文章

  1. 人生没有对与错,只是选择不同
  2. 这个黑科技小音箱,不用连蓝牙、一触即播
  3. 各种震撼的慢镜头,奇怪的知识又增加了!​
  4. 这个被称为20世纪最伟大人物的最强理科生,到底有多强,你根本不了解
  5. 全网爆红!全新洗脑神曲:程序员Disco
  6. mysql 1054 42s22_MySQL ERROR 1054(42S22)
  7. getchar()到底怎么用_怎样才能真正发挥肥效,腐植酸水溶肥到底怎么用
  8. qt4.7 mysql_详解Qt 4.7编译和访问Mysql驱动
  9. sql 计算 某字段 不同值出现 的次数_教你如何合理选用和计算电线规格,电线回路分配和注意事项...
  10. linux备份文件到ftp上,Linux服务器下用FTP上传下载备份文件