题目传送门

以二维为例,二维下两点间的曼哈顿距离最大值为\(max(|x_i-x_j| + |y_i-y_j|)\),可以通过枚举坐标符号正负来去掉绝对值。即\(max(x_i-x_j+y_i-y_j,x_i+x_j+y_i-y_j...)\)共16种情况。设\(f[i][t]\)表示第\(i\)个点各维度数值正负状态为\(t\)时的值,假如二维向量\(p[i]=(1,2)\),那么状态\(t\)的范围为\([0,3]\),如果\(t=2\),即二进制表示为\(10\),那么\(p\)向量第一维数值加个负号,第二维数值不变,类似状压过程。对于每个向量处理出\(f\)的值。最终结果即在\([l,r]\)范围内求\(max(f[i][m],f[j][n])(m+n=(1<<k)-1)\),具体用线段树实现。

#include<cstdio>
#include<vector>
#include<algorithm>
#define ls (u << 1)
#define rs (u << 1 | 1)
using namespace std;
const int N = 2e5 + 50; struct Node{
vector<int> val;
Node() { val.resize(35); }
}node[N << 2]; int n, k, q;
int a[N][6]; void Max(const vector<int> &x, const vector<int> &y, vector<int> &z){
for(int i = 0; i < (1 << k); ++i) z[i] = max(x[i], y[i]);
} void Max(const vector<int> &x, vector<int> &y){
for(int i = 0; i < (1 << k); ++i) y[i] = max(x[i], y[i]);
} void build(int u, int l, int r){
if(l == r){
for(int s = 0; s < (1 << k); ++s){
for(int t = 1; t <= k; ++t){
if(s & (1 << (t - 1))) node[u].val[s] += a[l][t];
else node[u].val[s] -= a[l][t];
}
}
return ;
}
int mid = (l + r) >> 1;
if(l <= mid) build(ls, l, mid);
if(r > mid) build(rs, mid + 1, r);
Max(node[ls].val, node[rs].val, node[u].val);
} void modify(int u, int l, int r, int pos){
if(l == r){
for(int i = 0; i < (1 << k); ++i) node[u].val[i] = 0;
for(int s = 0; s < (1 << k); ++s){
for(int t = 1; t <= k; ++t){
if(s & (1 << (t - 1))) node[u].val[s] += a[l][t];
else node[u].val[s] -= a[l][t];
}
}
return ;
}
int mid = (l + r) >> 1;
if(pos <= mid) modify(ls, l, mid, pos);
else modify(rs, mid + 1, r, pos);
Max(node[ls].val, node[rs].val, node[u].val);
} vector<int> ans(35); void query(int u, int l, int r, int ql, int qr){
if(ql <= l && qr >= r){
Max(node[u].val, ans);
return ;
}
int mid = (l + r) >> 1;
if(ql <= mid) query(ls, l, mid, ql, qr);
if(qr > mid) query(rs, mid + 1, r, ql, qr);
} int main(){
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; ++i)
for(int t = 1; t <= k; ++t)
scanf("%d", &a[i][t]);
build(1, 1, n);
scanf("%d", &q);
while(q--){
int opt, id, l, r;
scanf("%d", &opt);
if(opt == 1){
scanf("%d", &id);
for(int i = 1; i <= k; ++i) scanf("%d", &a[id][i]);
modify(1, 1, n, id);
}
else{
for(int i = 0; i < 35; ++i) ans[i] = -1e9;
scanf("%d%d", &l, &r);
query(1, 1, n, l, r);
int maxx = 0;
for(int s = 0; s < (1 << k); ++s){
maxx = max(maxx, ans[s] + ans[(1 << k) - 1 - s]);
}
printf("%d\n", maxx);
}
}
}

Educational Codeforces Round 56 (Rated for Div. 2) G题(线段树,曼哈顿距离)的更多相关文章

  1. Educational Codeforces Round 81 (Rated for Div. 2)E(线段树)

    预处理把左集划分为大小为1~i-1时,把全部元素都移动到右集的代价,记作sum[i]. 然后枚举终态时左集的大小,更新把元素i 留在/移动到 左集的代价. 树状数组/线段树处理区间修改/区间查询 #d ...

  2. Educational Codeforces Round 73 (Rated for Div. 2)F(线段树,扫描线)

    这道题里线段树用来区间更新(每次给更大的区间加上当前区间的权重),用log的复杂度加快了更新速度,也用了区间查询(查询当前区间向右直至最右中以当前区间端点向右一段区间的和中最大的那一段的和),也用lo ...

  3. Educational Codeforces Round 72 (Rated for Div. 2)E(线段树,思维)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;#define BUF_SIZE 100000 ...

  4. Educational Codeforces Round 39 (Rated for Div. 2) G

    Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...

  5. Multidimensional Queries(二进制枚举+线段树+Educational Codeforces Round 56 (Rated for Div. 2))

    题目链接: https://codeforces.com/contest/1093/problem/G 题目: 题意: 在k维空间中有n个点,每次给你两种操作,一种是将某一个点的坐标改为另一个坐标,一 ...

  6. Educational Codeforces Round 56 (Rated for Div. 2) D. Beautiful Graph 【规律 && DFS】

    传送门:http://codeforces.com/contest/1093/problem/D D. Beautiful Graph time limit per test 2 seconds me ...

  7. Educational Codeforces Round 56 (Rated for Div. 2) ABCD

    题目链接:https://codeforces.com/contest/1093 A. Dice Rolling 题意: 有一个号数为2-7的骰子,现在有一个人他想扔到几就能扔到几,现在问需要扔多少次 ...

  8. Educational Codeforces Round 56 (Rated for Div. 2) D

    给你一个无向图 以及点的个数和边  每个节点只能用1 2 3 三个数字 求相邻 两个节点和为奇数   能否构成以及有多少种构成方法 #include<bits/stdc++.h> usin ...

  9. Educational Codeforces Round 56 (Rated for Div. 2)

    涨rating啦.. 不过话说为什么有这么多数据结构题啊,难道是中国人出的? A - Dice Rolling 傻逼题,可以用一个三加一堆二或者用一堆二,那就直接.. #include<cstd ...

  10. Educational Codeforces Round 56 (Rated for Div. 2) F - Vasya and Array dp好题

    F - Vasya and Array dp[ i ][ j ] 表示用了前 i 个数字并且最后一个数字是 j 的方案数. dp[ i ][ j ] = sumdp [i - 1 ][ j ], 这样 ...

随机推荐

  1. [golang]使用logrus自定义日志模块

    简介 logrus是一个第三方日志库,性能虽不如zap和zerolog,但方便易用灵活.logrus完全兼容标准的log库,还支持文本.JSON两种日志输出格式. 特点 相较于标准库,logrus有更 ...

  2. PB从入坑到放弃(六)动态SQL应用

    写在前面 动态 SQL 语句是部分或者整个 SQL 语句在运行时才能确定,可以更好的与用户进行交互,大大提高了SQL的灵活性 一.执行SQL语句 1.1 执行无入参SQL ① 语法 EXECUTE I ...

  3. python列表的增删

    list = [1, 2, 3, 4]# 打印后两位print(list[-2:])# 打印前2位print(list[:2])# 修改列表元素list[0] = 5print(list)# 添加元素 ...

  4. 【io_uring】liburing 用户库源码分析

    文章目录 整体流程 `io_uring_queue_init` `io_uring_get_sqe` `io_uring_prep_#OP` `io_uring_sqe_set_data` `io_u ...

  5. 无界AI绘画基础教程,和Midjourney以及Stable Diffusion哪个更好用?

    本教程收集于:AIGC从入门到精通教程汇总 简单的总结 Midjourney,Stable Diffusion,无界AI的区别? Midjourney,收费,上手容易,做出来高精度的图需要自己掌握好咒 ...

  6. 使用GPU搭建支持玛雅(Maya)和Adobe AI,DW,PS的职校云计算机房

    背景 学校为职业学校,计算机教室需要进行Maya.Adobe Illustrator.Adobe Dreamweaver.Adobe PhotoShop等软件的教学.每个教室为35用户.资源需求为4核 ...

  7. window 安装多个低版本chrome测试

    最近在用next13做一个简单的项目,需要兼容chrome 60+以上版本,为了方便测试,特意在公司的台式机上安装了低版本. 这里简单记录下高版本覆盖低版本的问题,这个方法不影响Windows系统内已 ...

  8. VOLTE:MIUI14无5G信号、通话质量差、短信收不到的原因之一

    在最近一次miui版本更新后的一段时间里,先后出现以下一些情况: 1. 在"双卡与移动网络"设置中,无论如何折腾"5G网络"开关或者"5G网络模式选择 ...

  9. Redis漏洞总结--未授权--沙箱绕过--(CNVD-2015-07557)&&(CNVD-2019-21763)&&(CVE-2022-0543)

    Redis未授权--沙箱绕过--(CNVD-2015-07557)&&(CNVD-2019-21763)&&(CVE-2022-0543) 环境复现 采用Vulfocu ...

  10. MySQL innoDB 间隙锁产生的死锁问题

    背景 线上经常偶发死锁问题,当时处理一张表,也没有联表处理,但是有两个mq入口,并且消息体存在一样的情况,频率还不是很低,这么一个背景,我非常容易怀疑到,两个消息同时近到这一个事务里面导致的,但是是偶 ...