The Kouga Ninja Scrolls

这题可真暴力呀!曼哈顿距离转成切比雪夫距离后大力线段树搞即可!第一次把线段树封装一下,为了x,yx,yx,y两个坐标不用写两棵线段树,也是第一次把pushpushpush_upupup写成结构体mergemergemerge形式,为了方便query时的区间合并。而且写好后(赛后)1A,刺激!!!

题意

给定二维平面上nnn个点(编号111~nnn),以及每个点的颜色(帮派),三种操作:

  1. op1:op1:op1:将第iii个点的移动到另一个位置
  2. op2:op2:op2:改变第iii个点的颜色(帮派)
  3. op3:op3:op3:询问编号属于[l,r][l,r][l,r]的点中曼哈顿距离的最大值(要求选定最远点对颜色不同)

思路

  1. 看见曼哈顿距离最大值,尽可能往切比雪夫距离上面想。比如这题,将距离转化后,我们只需要分别考虑xxx距离最大值和yyy距离最大值即可;
  2. 然后就是如何分别求这两个最大距离,容易想到利用坐标的区间最大值和区间最小值,相减即是区间最大值啦!
  3. 但题目有个限制,也就是大幅度增加此题码量的地方!最大距离点对颜色不能相同,那就只能再分别维护一个坐标次大值和坐标次小值(且颜色要与最大次大不同),这样当最大最小的两个点颜色相同时,就把其中一个换成次一点的。
  4. 那么,思路就是如此了,代码码起来也是异常舒服!

代码

#include "bits/stdc++.h"
#define hhh printf("hhh\n")
#define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
using namespace std;
typedef long long ll;
typedef pair<int,int> pr;
inline ll read() {ll x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;}const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
const double eps = 1e-7;int n, m;
ll x[maxn], y[maxn], belong[maxn];struct P{ll m[4]; int b[4];void clear() {memset(m,0,sizeof(m));memset(b,0,sizeof(b));}P() { clear(); }friend P merge(const P &c, P const &b) {//第一次写成结构体合并的形式,真的舒服P a=c;if(b.b[0]) {if(!a.b[0]||b.m[0]>=a.m[0]) {if(!a.b[0]) a.m[0]=b.m[0], a.b[0]=b.b[0];else if(b.b[0]!=a.b[0]) {swap(a.m[0],a.m[1]); swap(a.b[0],a.b[1]);a.m[0]=b.m[0], a.b[0]=b.b[0];}else if(b.m[0]>a.m[0]) a.m[0]=b.m[0];}else if(b.b[0]!=a.b[0]&&(!a.b[1]||b.m[0]>a.m[1])) {a.m[1]=b.m[0], a.b[1]=b.b[0];}}if(b.b[1]) {if(!a.b[0]||b.m[1]>=a.m[0]) {if(!a.b[0]) a.m[0]=b.m[1], a.b[0]=b.b[1];else if(b.b[1]!=a.b[0]) {swap(a.m[0],a.m[1]); swap(a.b[0],a.b[1]);a.m[0]=b.m[1], a.b[0]=b.b[1];}else if(b.m[1]>a.m[0]) a.m[0]=b.m[1];}else if(b.b[1]!=a.b[0]&&(!a.b[1]||b.m[1]>a.m[1])) {a.m[1]=b.m[1], a.b[1]=b.b[1];}}if(b.b[3]) {if(!a.b[3]||b.m[3]<=a.m[3]) {if(!a.b[3]) a.m[3]=b.m[3], a.b[3]=b.b[3];else if(b.b[3]!=a.b[3]) {swap(a.m[3],a.m[2]); swap(a.b[3],a.b[2]);a.m[3]=b.m[3], a.b[3]=b.b[3];}else if(b.m[3]<a.m[3]) a.m[3]=b.m[3];}else if(b.b[3]!=a.b[3]&&(!a.b[2]||b.m[3]<a.m[2])) {a.m[2]=b.m[3], a.b[2]=b.b[3];}}if(b.b[2]) {if(!a.b[3]||b.m[2]<=a.m[3]) {if(!a.b[3]) a.m[3]=b.m[2], a.b[3]=b.b[2];else if(b.b[2]!=a.b[3]) {swap(a.m[3],a.m[2]); swap(a.b[3],a.b[2]);a.m[3]=b.m[2], a.b[3]=b.b[2];}else if(b.m[2]<a.m[3]) a.m[3]=b.m[2];}else if(b.b[2]!=a.b[3]&&(!a.b[2]||b.m[2]<a.m[2])) {a.m[2]=b.m[2], a.b[2]=b.b[2];}}return a;}
};struct SegmentTree{//第一次把线段树给封装了,也是真的舒服!!!P node[maxn<<2];void build(int l, int r, int now) {node[now].clear();if(l==r) return;int m=(l+r)/2;build(l,m,now<<1); build(m+1,r,now<<1|1);}void update(int x, ll d, int l, int r, int now) {if(l==r) {node[now].m[0]=node[now].m[3]=d;node[now].b[0]=node[now].b[3]=belong[x];return;}int m=(l+r)/2;if(x<=m) update(x,d,l,m,now<<1);else update(x,d,m+1,r,now<<1|1);node[now]=merge(node[now<<1],node[now<<1|1]);}P query(int x, int y, int l, int r, int now) {if(x<=l&&r<=y) return node[now];int m=(l+r)/2;P ans;if(x<=m) ans=merge(ans,query(x,y,l,m,now<<1));if(y>m) ans=merge(ans,query(x,y,m+1,r,now<<1|1));return ans;}ll solve(int x, int y) {P ans=query(x,y,1,n,1);ll res=-2e18;if(!ans.b[0]||!ans.b[3]) return 0;if(ans.b[0]==ans.b[3]) {if(ans.b[2]) res=max(res,ans.m[0]-ans.m[2]);if(ans.b[1]) res=max(res,ans.m[1]-ans.m[3]);}else res=ans.m[0]-ans.m[3];if(res<-1e18) return 0;return res;}
}sx, sy;int main() {int T=read(); int t=0;while(T--) {printf("Case #%d:\n", ++t);n=read(), m=read();sx.build(1,n,1); sy.build(1,n,1);for(int i=1; i<=n; ++i) {ll x=read(), y=read(); belong[i]=read();::x[i]=x+y, ::y[i]=x-y;sx.update(i,::x[i],1,n,1);sy.update(i,::y[i],1,n,1);}for(int i=1; i<=m; ++i) {int op=read();if(op==1) {int k=read(); ll dx=read(), dy=read();x[k]+=dx+dy; y[k]+=dx-dy;sx.update(k,x[k],1,n,1);sy.update(k,y[k],1,n,1);}else if(op==2) {int k=read(), c=read();belong[k]=c;sx.update(k,x[k],1,n,1);sy.update(k,y[k],1,n,1);}else if(op==3) {int l=read(), r=read();printf("%lld\n", max(sx.solve(l,r),sy.solve(l,r)));}}}
}

The Kouga Ninja Scrolls(2018沈阳现场E+切比雪夫距离+线段树维护最大次大最小次小)相关推荐

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

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

  2. 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​∣),显然我们可以 ...

  3. HDU6218 2017ACM/ICPC亚洲区沈阳站 Bridge(Set,线段树)

    HDU6218 2017ACM/ICPC亚洲区沈阳站 Bridge Solution 我们考虑维护在环上的边的个数,答案就是总边数减去环上边数. 环的形态是这样的:(0,l),(0,l+1)...(0 ...

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

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

  5. 2018 shenyang ICPC E - The Kouga Ninja Scrolls

    维护区间最大值,区间最小值.区间次小值,区间次大值.且区间最大值和次大值,最小值和次小值不能同色. 注意转换为切比雪夫距离之后,x和y的值可以分开来考虑.不过维护的时候别重新写两个函数维护,这样太丑了 ...

  6. 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: 表 ...

  7. 2018沈阳网络赛:J kachang KD树

    把每个点建立(dfs序,depth),所有操作和查询转化为矩形操作,用KD树就可以 n(√n) n ( n ) n\sqrt(n)完成了. #include <bits/stdc++.h> ...

  8. 2018.06.28 与或(线段树)

    #与或 描述 样例输入 5 8 1 3 2 5 4 3 1 3 2 1 1 5 3 1 3 1 1 4 6 2 3 4 1 3 2 3 2 2 3 4 3 1 5 **样例输出 ** 3 5 3 7 ...

  9. [集训队作业2018] 万圣节的积木(李超线段树)

    传送门 设最底层为第1层,倒数第二层为第2层,以此类推. 发现若第111 ~ iii层构成的积木稳定,第111 ~ jjj (j>ij>ij>i)构成的积木也稳定, 那么第i+1i+ ...

最新文章

  1. 目标检测的渐进域自适应,优于最新SOTA方法
  2. SQL*PLUS命令的使用大全
  3. 微软研究公司公布新的Slimmed Down AR眼镜
  4. python-print
  5. MySQl的库操作、表操作和数据操作
  6. 4:springApplication.run 原理
  7. 谈谈nodejs爬虫程序利器——cheerio模块
  8. 双屏全屏跳回到主屏_双屏笔记本了解下?剪视频不要太好使
  9. enableEventValidation错误原因分析以及解决办法
  10. java for android的书_JavaForAndroid07
  11. 微信自动跳转默认浏览器 微信扫一扫直接打开外部浏览器
  12. amd 服务器cpu型号怎么看,怎么看CPU是几代的?intel和AMD怎么区分CPU是第几代的方法...
  13. 计算机语言phal语言,phalapi
  14. Linux中CPU使用率低负载高
  15. 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)
  16. 学计算机的什么是镜像,一、什么是windows镜像?什么是Ghost?它们有什么优缺点?...
  17. 聊天软件黑盒测试,duckchat
  18. 有没有能够在待办事项完成后标记任务已完成的每日计划APP?
  19. 在线计算机能力测试答案,计算机基础知识在线测试答案-20210514014539.doc-原创力文档...
  20. 睢宁中学北校2021年高考成绩查询,2021年睢宁县高考状元名单资料,今年睢宁县高考状元多少分...

热门文章

  1. Uva 1626(区间dp)
  2. python是跨平台的 以及 py、pyc、pyo
  3. 1.43 亿人信息被盗,整个美国都慌了;Linux 发行版 SUSE 诞生 25 周年
  4. 一则帖子整理:30岁人生困惑,路在何方?
  5. 编程习题练习记录--台球碰撞
  6. 小米笔记本电脑触摸板失灵解决方案
  7. “上云 用数 赋智”,这说的不是数字中台吗?
  8. 计算机考试题库判断题,计算机等级考试、期末计算机考试复习题库--1.判断题...
  9. 20155305乔磊2016-2017-2《Java程序设计》第六周学习总结
  10. 网站底部的统计代码HTML