ACM-ICPC 2018 沈阳赛区现场赛 E. The Kouga Ninja Scrolls (切比雪夫距离+线段树)
题目链接:
题意:在二维平面上有 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 (切比雪夫距离+线段树)的更多相关文章
- ACM-ICPC 2018 沈阳赛区现场赛 K. Let the Flames Begin (约瑟夫环问题)
题目链接: 题意:有 n 个人围成一个圈,从 1 开始报到第 k 个人出环,问第 m 个出环的人是谁,n.m.k <= 1e18 且 min(m,k)<= 2e6. 题解:容易得出O(m) ...
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...
- HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)
HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: ...
- 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 ...
- ICPC 2018 徐州赛区网络赛
ACM-ICPC 2018 徐州赛区网络赛 去年博客记录过这场比赛经历:该死的水题 一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进. D. Easy Math 题意: ...
- ACM总结——2017ACM-ICPC北京赛区现场赛总结
现在距离比赛结束已经过了一个多星期了,也是终于有时间写下心得了.回来就是被压着做项目,也是够够的. 这次比赛一样是我和两个学弟(虽然是学弟,但我的实力才是最弱的T_T)一起参加的,成绩的话打铁,算是情 ...
- ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)
目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...
- ACM-ICPC 2018 青岛赛区现场赛 K. Airdrop && ZOJ 4068 (暴力)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4068 题意:吃鸡游戏简化为二维平面上有 n 个人 (xi,yi) ...
- ACM-ICPC 2018 青岛赛区现场赛 D. Magic Multiplication && ZOJ 4061 (思维+构造)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4061 题意:定义一个长度为 n 的序列 a1,a2,..,an ...
随机推荐
- K8S从入门到放弃系列-(9)kubernetes集群之kubelet部署
摘要: Kubelet组件运行在Node节点上,维持运行中的Pods以及提供kuberntes运行时环境,主要完成以下使命: 1.监视分配给该Node节点的pods 2.挂载pod所需要的volume ...
- 分布式架构下,session共享有什么方案么?
分布式架构下,session共享有什么方案么? 会点代码的大叔 科技领域创作者 分布式架构下的session共享,也可以称作分布式session一致性:关于这个问题,和大家说一说解决方案(如果有其他的 ...
- 利用Python进行数据分析_Numpy_基础_3
通用函数:快速的元素级数组函数 通用函数,是指对数组中的数据执行元素级运算的函数:接受一个或多个标量值,并产生一个或多个标量值. sqrt 求平方根 np.sqrt(arr) exp 计算各元素指数 ...
- js文件分段上传
前端代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/T ...
- [ZJOI2007]捉迷藏 (线段树,括号序列)
大意: 给定树, 要求维护一个点集, 支持删点添点, 询问点集直径. 本题做法比较多. 一个显然的做法是, 线段树维护区间直径, 然后根据点集直径的性质, 合并后直径端点一定是四个端点其中两个, 枚举 ...
- Eclipse 反编译工具 jad
** 1 下载 jad工具 ** 2 将.exe文件放在jdk安装路径下,里面有java ,javac 等命令,然后将jad.jar放在eclipse的dropins目录下 ** 3 启动eclips ...
- 【es6】将2个数组合并为一个数组
//第一种 一个数组中的值为key 一个数组中的值为value let arr1 = ['内存','颜色','尺寸']; let arr2 = [1,2,3]; let temp = arr1.map ...
- [NOIP2018模拟赛10.20A]挂分报告
闲扯 先看看了B组,T1 ZROI刚好讲过一个性质原根一般很小的,直接枚举;T2一眼二分然后似乎状压 T3没看 然后上来A组题,T1 flow这名字...网络流?! T1题面非常的社会主义核心价值观, ...
- mysql8中查询语句表别名不能使用 “of”
今天在迁移一个项目的时候,发现有一个sql报错,但是语句跟迁移之前完全一样,所以想来应该是 mysql 版本差异导致的. 迁移之前版本:5.6.28(腾讯云) 迁移之后版本:8.0.16(阿里云) 新 ...
- Python练习_购物车_day6
第一次代码 (1) 输出商品列表,用户输入序号,显示用户选中的商品. 页面显示 序号 + 商品名称,如: 1 手机 2 电脑 (2): 用户输入选择的商品序号,然后打印商品名称 (3):如果用户输入的 ...