题目链接:

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

题解:首先需要将曼哈顿距离转化成切比雪夫距离(不懂戳https://www.cnblogs.com/zwfymqz/p/8253530.html),然后用线段树维护一个区间内两个不同门派 x 和 y 的最大最小和次大次小值即可。(维护次大/次小值是因为若区间内的最大值和最小值的人是同一个门派的话则不能进行比较)(代码写的很丑,建议理解做法后自己写一个...

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 1e5 + ;
const int MAXM = 1e7 + ;
const ll mod = 1e9 + ; ll x[MAXN],y[MAXN];
int c[MAXN]; struct node {
pair<ll,int> mxx[], mnx[];
pair<ll,int> mxy[], mny[];
}st[MAXN<<]; void pushup(int rt) {
st[rt] = st[rt<<];
if(st[rt].mxx[].se == -) st[rt].mxx[] = st[rt<<|].mxx[], st[rt].mxx[] = st[rt<<|].mxx[];
else if(st[rt<<|].mxx[] >= st[rt].mxx[]) {
if(st[rt<<|].mxx[].se != st[rt].mxx[].se) {
st[rt].mxx[] = st[rt].mxx[], st[rt].mxx[] = st[rt<<|].mxx[];
if(st[rt<<|].mxx[].se != - && st[rt<<|].mxx[].se != st[rt].mxx[].se && st[rt<<|].mxx[].fi >= st[rt].mxx[].fi)
st[rt].mxx[] = st[rt<<|].mxx[];
} else {
st[rt].mxx[] = st[rt<<|].mxx[];
if(st[rt<<|].mxx[].se != - && st[rt<<|].mxx[].se != st[rt].mxx[].se && st[rt<<|].mxx[].fi >= st[rt].mxx[].fi)
st[rt].mxx[] = st[rt<<|].mxx[];
}
} else {
if(st[rt<<|].mxx[].se != st[rt].mxx[].se && st[rt<<|].mxx[].fi >= st[rt].mxx[].fi)
st[rt].mxx[] = st[rt<<|].mxx[];
else if(st[rt<<|].mxx[].se != - && st[rt<<|].mxx[].se != st[rt].mxx[].se && st[rt<<|].mxx[].fi >= st[rt].mxx[].fi)
st[rt].mxx[] = st[rt<<|].mxx[];
}
//mnx
if(st[rt].mnx[].se == -) st[rt].mnx[] = st[rt<<|].mnx[], st[rt].mnx[] = st[rt<<|].mnx[];
else if(st[rt<<|].mnx[] <= st[rt].mnx[]) {
if(st[rt<<|].mnx[].se != st[rt].mnx[].se) {
st[rt].mnx[] = st[rt].mnx[], st[rt].mnx[] = st[rt<<|].mnx[];
if(st[rt<<|].mnx[].se != - && st[rt<<|].mnx[].se != st[rt].mnx[].se && st[rt<<|].mnx[].fi <= st[rt].mnx[].fi)
st[rt].mnx[] = st[rt<<|].mnx[];
} else {
st[rt].mnx[] = st[rt<<|].mnx[];
if(st[rt<<|].mnx[].se != - && st[rt<<|].mnx[].se != st[rt].mnx[].se && st[rt<<|].mnx[].fi <= st[rt].mnx[].fi)
st[rt].mnx[] = st[rt<<|].mnx[];
}
} else {
if(st[rt<<|].mnx[].se != st[rt].mnx[].se && st[rt<<|].mnx[].fi <= st[rt].mnx[].fi)
st[rt].mnx[] = st[rt<<|].mnx[];
else if(st[rt<<|].mnx[].se != - && st[rt<<|].mnx[].se != st[rt].mnx[].se && st[rt<<|].mnx[].fi <= st[rt].mnx[].fi)
st[rt].mnx[] = st[rt<<|].mnx[];
}
//mxy
if(st[rt].mxy[].se == -) st[rt].mxy[] = st[rt<<|].mxy[], st[rt].mxy[] = st[rt<<|].mxy[];
else if(st[rt<<|].mxy[] >= st[rt].mxy[]) {
if(st[rt<<|].mxy[].se != st[rt].mxy[].se) {
st[rt].mxy[] = st[rt].mxy[], st[rt].mxy[] = st[rt<<|].mxy[];
if(st[rt<<|].mxy[].se != - && st[rt<<|].mxy[].se != st[rt].mxy[].se && st[rt<<|].mxy[].fi >= st[rt].mxy[].fi)
st[rt].mxy[] = st[rt<<|].mxy[];
} else {
st[rt].mxy[] = st[rt<<|].mxy[];
if(st[rt<<|].mxy[].se != - && st[rt<<|].mxy[].se != st[rt].mxy[].se && st[rt<<|].mxy[].fi >= st[rt].mxy[].fi)
st[rt].mxy[] = st[rt<<|].mxy[];
}
} else {
if(st[rt<<|].mxy[].se != st[rt].mxy[].se && st[rt<<|].mxy[].fi >= st[rt].mxy[].fi)
st[rt].mxy[] = st[rt<<|].mxy[];
else if(st[rt<<|].mxy[].se != - && st[rt<<|].mxy[].se != st[rt].mxy[].se && st[rt<<|].mxy[].fi >= st[rt].mxy[].fi)
st[rt].mxy[] = st[rt<<|].mxy[];
}
//mny
if(st[rt].mny[].se == -) st[rt].mny[] = st[rt<<|].mny[], st[rt].mny[] = st[rt<<|].mny[];
else if(st[rt<<|].mny[] <= st[rt].mny[]) {
if(st[rt<<|].mny[].se != st[rt].mny[].se) {
st[rt].mny[] = st[rt].mny[], st[rt].mny[] = st[rt<<|].mny[];
if(st[rt<<|].mny[].se != - && st[rt<<|].mny[].se != st[rt].mny[].se && st[rt<<|].mny[].fi <= st[rt].mny[].fi)
st[rt].mny[] = st[rt<<|].mny[];
} else {
st[rt].mny[] = st[rt<<|].mny[];
if(st[rt<<|].mny[].se != - && st[rt<<|].mny[].se != st[rt].mny[].se && st[rt<<|].mny[].fi <= st[rt].mny[].fi)
st[rt].mny[] = st[rt<<|].mny[];
}
} else {
if(st[rt<<|].mny[].se != st[rt].mny[].se && st[rt<<|].mny[].fi <= st[rt].mny[].fi)
st[rt].mny[] = st[rt<<|].mny[];
else if(st[rt<<|].mny[].se != - && st[rt<<|].mny[].se != st[rt].mny[].se && st[rt<<|].mny[].fi <= st[rt].mny[].fi)
st[rt].mny[] = st[rt<<|].mny[];
}
} void build(int rt,int l,int r) {
if(l == r) {
st[rt].mxx[].fi = st[rt].mnx[].fi = x[l], st[rt].mxx[].se = st[rt].mnx[].se = c[l];
st[rt].mxx[].se = st[rt].mnx[].se = -;
st[rt].mxy[].fi = st[rt].mny[].fi = y[l], st[rt].mxy[].se = st[rt].mny[].se = c[l];
st[rt].mxy[].se = st[rt].mny[].se = -;
return ;
}
int mid = (l + r) >> ;
build(rt<<,l,mid);
build(rt<<|,mid + ,r);
pushup(rt);
} void update(int rt,int l,int r,int pos) {
if(l == r) {
st[rt].mxx[].fi = st[rt].mnx[].fi = x[l], st[rt].mxx[].se = st[rt].mnx[].se = c[l];
st[rt].mxx[].se = st[rt].mnx[].se = -;
st[rt].mxy[].fi = st[rt].mny[].fi = y[l], st[rt].mxy[].se = st[rt].mny[].se = c[l];
st[rt].mxy[].se = st[rt].mny[].se = -;
return ;
}
int mid = (l + r) >> ;
if(pos <= mid) update(rt<<,l,mid,pos);
else update(rt<<|,mid + ,r,pos);
pushup(rt);
} node ans; void query(int rt,int l,int r,int ql,int qr) {
if(ql <= l && qr >= r) {
//mxx
if(ans.mxx[].se == -) ans.mxx[] = st[rt].mxx[], ans.mxx[] = st[rt].mxx[];
else if(st[rt].mxx[] >= ans.mxx[]) {
if(st[rt].mxx[].se != ans.mxx[].se) {
ans.mxx[] = ans.mxx[], ans.mxx[] = st[rt].mxx[];
if(st[rt].mxx[].se != - && st[rt].mxx[].se != ans.mxx[].se && st[rt].mxx[].fi >= ans.mxx[].fi)
ans.mxx[] = st[rt].mxx[];
} else {
ans.mxx[] = st[rt].mxx[];
if(st[rt].mxx[].se != - && st[rt].mxx[].se != ans.mxx[].se && st[rt].mxx[].fi >= ans.mxx[].fi)
ans.mxx[] = st[rt].mxx[];
}
} else {
if(st[rt].mxx[].se != ans.mxx[].se && st[rt].mxx[].fi >= ans.mxx[].fi)
ans.mxx[] = st[rt].mxx[];
else if(st[rt].mxx[].se != - && st[rt].mxx[].se != ans.mxx[].se && st[rt].mxx[].fi >= ans.mxx[].fi)
ans.mxx[] = st[rt].mxx[];
}
//mnx
if(ans.mnx[].se == -) ans.mnx[] = st[rt].mnx[], ans.mnx[] = st[rt].mnx[];
else if(st[rt].mnx[] <= ans.mnx[]) {
if(st[rt].mnx[].se != ans.mnx[].se) {
ans.mnx[] = ans.mnx[], ans.mnx[] = st[rt].mnx[];
if(st[rt].mnx[].se != - && st[rt].mnx[].se != ans.mnx[].se && st[rt].mnx[].fi <= ans.mnx[].fi)
ans.mnx[] = st[rt].mnx[];
} else {
ans.mnx[] = st[rt].mnx[];
if(st[rt].mnx[].se != - && st[rt].mnx[].se != ans.mnx[].se && st[rt].mnx[].fi <= ans.mnx[].fi)
ans.mnx[] = st[rt].mnx[];
}
} else {
if(st[rt].mnx[].se != ans.mnx[].se && st[rt].mnx[].fi <= ans.mnx[].fi)
ans.mnx[] = st[rt].mnx[];
else if(st[rt].mnx[].se != - && st[rt].mnx[].se != ans.mnx[].se && st[rt].mnx[].fi <= ans.mnx[].fi)
ans.mnx[] = st[rt].mnx[];
}
//mxy
if(ans.mxy[].se == -) ans.mxy[] = st[rt].mxy[], ans.mxy[] = st[rt].mxy[];
else if(st[rt].mxy[] >= ans.mxy[]) {
if(st[rt].mxy[].se != ans.mxy[].se) {
ans.mxy[] = ans.mxy[], ans.mxy[] = st[rt].mxy[];
if(st[rt].mxy[].se != - && st[rt].mxy[].se != ans.mxy[].se && st[rt].mxy[].fi >= ans.mxy[].fi)
ans.mxy[] = st[rt].mxy[];
} else {
ans.mxy[] = st[rt].mxy[];
if(st[rt].mxy[].se != - && st[rt].mxy[].se != ans.mxy[].se && st[rt].mxy[].fi >= ans.mxy[].fi)
ans.mxy[] = st[rt].mxy[];
}
} else {
if(st[rt].mxy[].se != ans.mxy[].se && st[rt].mxy[].fi >= ans.mxy[].fi)
ans.mxy[] = st[rt].mxy[];
else if(st[rt].mxy[].se != - && st[rt].mxy[].se != ans.mxy[].se && st[rt].mxy[].fi >= ans.mxy[].fi)
ans.mxy[] = st[rt].mxy[];
}
//mny
if(ans.mny[].se == -) ans.mny[] = st[rt].mny[], ans.mny[] = st[rt].mny[];
else if(st[rt].mny[] <= ans.mny[]) {
if(st[rt].mny[].se != ans.mny[].se) {
ans.mny[] = ans.mny[], ans.mny[] = st[rt].mny[];
if(st[rt].mny[].se != - && st[rt].mny[].se != ans.mny[].se && st[rt].mny[].fi <= ans.mny[].fi)
ans.mny[] = st[rt].mny[];
} else {
ans.mny[] = st[rt].mny[];
if(st[rt].mny[].se != - && st[rt].mny[].se != ans.mny[].se && st[rt].mny[].fi <= ans.mny[].fi)
ans.mny[] = st[rt].mny[];
}
} else {
if(st[rt].mny[].se != ans.mny[].se && st[rt].mny[].fi <= ans.mny[].fi)
ans.mny[] = st[rt].mny[];
else if(st[rt].mny[].se != - && st[rt].mny[].se != ans.mny[].se && st[rt].mny[].fi <= ans.mny[].fi)
ans.mny[] = st[rt].mny[];
}
return ;
}
int mid = (l + r) >> ;
if(qr <= mid) query(rt<<,l,mid,ql,qr);
else if(ql > mid) query(rt<<|,mid + ,r,ql,qr);
else {
query(rt<<,l,mid,ql,mid);
query(rt<<|,mid + ,r,mid + ,qr);
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int cas = ;
int t;
scanf("%d",&t);
while(t--) {
printf("Case #%d:\n",cas++);
int n,m;
scanf("%d%d",&n,&m);
for(int i = ; i <= n; i++) {
ll x0,y0;
scanf("%lld%lld%d",&x0,&y0,&c[i]);
x[i] = x0 + y0, y[i] = x0 - y0;
}
build(,,n);
while(m--) {
int op;
scanf("%d",&op);
if(op == ) {
int k;
ll x0,y0;
scanf("%d%lld%lld",&k,&x0,&y0);
x[k] += x0 + y0, y[k] += x0 - y0;
update(,,n,k);
} else if(op == ) {
int k,col;
scanf("%d%d",&k,&col);
c[k] = col;
update(,,n,k);
} else if(op == ) {
int l,r;
scanf("%d%d",&l,&r); for(int i = ; i < ; i++) {
ans.mxx[i].se = ans.mnx[i].se = -;
ans.mxy[i].se = ans.mny[i].se = -;
}
query(,,n,l,r);
ll out = ;
//x
if(ans.mxx[].se != -) {
if(ans.mxx[].se != - && ans.mxx[].se != ans.mxx[].se)
out = max(out,abs(ans.mxx[].fi - ans.mxx[].fi));
if(ans.mnx[].se != - && ans.mnx[].se != ans.mxx[].se)
out = max(out,abs(ans.mxx[].fi - ans.mnx[].fi));
if(ans.mnx[].se != - && ans.mnx[].se != ans.mxx[].se)
out = max(out,abs(ans.mxx[].fi - ans.mnx[].fi));
}
if(ans.mxx[].se != -) {
if(ans.mnx[].se != - && ans.mnx[].se != ans.mxx[].se)
out = max(out,abs(ans.mxx[].fi - ans.mnx[].fi));
if(ans.mnx[].se != - && ans.mnx[].se != ans.mxx[].se)
out = max(out,abs(ans.mxx[].fi - ans.mnx[].fi));
}
if(ans.mnx[].se != - && ans.mnx[].se != -)
out = max(out,abs(ans.mnx[].fi - ans.mnx[].fi));
//y
if(ans.mxy[].se != -) {
if(ans.mxy[].se != - && ans.mxy[].se != ans.mxy[].se)
out = max(out,abs(ans.mxy[].fi - ans.mxy[].fi));
if(ans.mny[].se != - && ans.mny[].se != ans.mxy[].se)
out = max(out,abs(ans.mxy[].fi - ans.mny[].fi));
if(ans.mny[].se != - && ans.mny[].se != ans.mxy[].se)
out = max(out,abs(ans.mxy[].fi - ans.mny[].fi));
}
if(ans.mxy[].se != -) {
if(ans.mny[].se != - && ans.mny[].se != ans.mxy[].se)
out = max(out,abs(ans.mxy[].fi - ans.mny[].fi));
if(ans.mny[].se != - && ans.mny[].se != ans.mxy[].se)
out = max(out,abs(ans.mxy[].fi - ans.mny[].fi));
}
if(ans.mny[].se != - && ans.mny[].se != -)
out = max(out,abs(ans.mny[].fi - ans.mny[].fi));
printf("%lld\n",out);
}
}
}
return ;
}

ACM-ICPC 2018 沈阳赛区现场赛 E. The Kouga Ninja Scrolls (切比雪夫距离+线段树)的更多相关文章

  1. ACM-ICPC 2018 沈阳赛区现场赛 K. Let the Flames Begin (约瑟夫环问题)

    题目链接: 题意:有 n 个人围成一个圈,从 1 开始报到第 k 个人出环,问第 m 个出环的人是谁,n.m.k <= 1e18 且 min(m,k)<= 2e6. 题解:容易得出O(m) ...

  2. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  3. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...

  4. ACM-ICPC 2018 沈阳赛区(网络赛)

    D.Made In Heaven One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with he ...

  5. ICPC 2018 徐州赛区网络赛

    ACM-ICPC 2018 徐州赛区网络赛  去年博客记录过这场比赛经历:该死的水题  一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进.     D. Easy Math 题意:   ...

  6. ACM总结——2017ACM-ICPC北京赛区现场赛总结

    现在距离比赛结束已经过了一个多星期了,也是终于有时间写下心得了.回来就是被压着做项目,也是够够的. 这次比赛一样是我和两个学弟(虽然是学弟,但我的实力才是最弱的T_T)一起参加的,成绩的话打铁,算是情 ...

  7. ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)

     目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...

  8. ACM-ICPC 2018 青岛赛区现场赛 K. Airdrop && ZOJ 4068 (暴力)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4068 题意:吃鸡游戏简化为二维平面上有 n 个人 (xi,yi) ...

  9. ACM-ICPC 2018 青岛赛区现场赛 D. Magic Multiplication && ZOJ 4061 (思维+构造)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4061 题意:定义一个长度为 n 的序列 a1,a2,..,an ...

随机推荐

  1. STL标准模板库之vector

    目录 vector容器 1)什么是vector 2)如何定义 3)常用的Vector函数 1.容量函数 2.增加函数 3.删除函数 4.迭代器 5.访问函数 6.其他函数及操作 7.算法 STL提供了 ...

  2. C++ algorithm算法库

    C++ algorithm算法库 Xun 标准模板库(STL)中定义了很多的常用算法,这些算法主要定义在<algorithm>中.编程时,只需要在文件中加入#include<algo ...

  3. 在订单服务中使用Hystrix进行熔断设置

    使用Hystrix熔断(上) 在一个分布式系统里,一个服务依赖多个服务,可能存在某个服务调用失败,         比如超时.异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,   ...

  4. 基于Task的多线程

    /// <summary> /// 基于Task的多线程 /// </summary> public class Tasks { public static void Task ...

  5. Nginx学习笔记(四):基本数据结构

    目录 Nginx的一些特点 Nginx自定义整数类型 异常机制错误处理 内存池 字符串 时间与日期 运行日志   Nginx的一些特点 高性能 采用事件驱动模型,可以无阻塞的处理海量并发连接 高稳定性 ...

  6. django 浅谈索引(转)

    https://blog.csdn.net/qq_37049050/article/details/80749381

  7. springboot 整合 web 项目找不到 jsp 文件

    今天遇到一个问题,就是使用springboot整合web项目的时候,怎么都访问不到 \webapp\WEB-INF\jsp\index.jsp 页面.这个问题搞了半天,试了各种方式.最后是因为在启动的 ...

  8. ES 6 日期util.js =>

    微信小程序demo const formatTime = date => { const year = date.getFullYear() const month = date.getMont ...

  9. 关于MQ的几件小事(四)如何保证消息不丢失

    1.mq原则 数据不能多,也不能少,不能多是说消息不能重复消费,这个我们上一节已解决:不能少,就是说不能丢失数据.如果mq传递的是非常核心的消息,支撑核心的业务,那么这种场景是一定不能丢失数据的. 2 ...

  10. Zookeeper 安装及集群配置注意点

    Zookeeper在ubuntu下安装及集群搭建,关于集群搭建,网上很多文章 可以参考:https://www.ibm.com/developerworks/cn/opensource/os-cn-z ...