题意是,给出n个k维空间下的点,然后q次操作,每次操作要么修改其中一个点的坐标,要么查询下标为[l,r]区间中所有点中两点的最大曼哈顿距离。

思路:参考blog:https://blog.csdn.net/Anxdada/article/details/81980574,里面讲了k维空间中的最大曼哈顿距离求法,然后利用这个方案改一改,用线段树来维护这些值就好了。

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(x) memset(x,0,sizeof x)
#define lson o*2
#define rson o*2+1
#define m (l+r)/2
const int maxn=;
struct node
{
int mi,mx;
}tr[*maxn][];
void pushup(int o,int idx)
{
tr[o][idx].mi=min(tr[lson][idx].mi,tr[rson][idx].mi);
tr[o][idx].mx=max(tr[lson][idx].mx,tr[rson][idx].mx);
}
int tmp[maxn][];
int a[maxn][];
void build(int o,int l,int r,int idx);
void update(int o,int l,int r,int x,int idx);
int cal(int n,int k)
{
int ans = , mi, mx, t;
for (int s = ; s < (<<k) ; s ++)
{
mi = 1e9, mx = -1e9;
for (int i = ; i <= n ; i++)
{
t = a[i][];
for (int j = ; j < k ; j++)
{
if ((<<j) & s) t += a[i][j];
else t -= a[i][j];
}
mi = min(mi, t);
mx = max(mx, t);
tmp[i][s]=t;
}
build(,,n,s);
ans = max(ans, mx-mi);
}
return ans;
}
int cal2(int x,int n,int k)
{
int t;
for (int s = ; s < (<<k) ; s ++)
{
int i=x;
t = a[i][];
for (int j = ; j < k ; j++)
{
if ((<<j) & s) t += a[i][j];
else t -= a[i][j];
}
tmp[i][s]=t;
update(,,n,i,s);
}
}
void build(int o,int l,int r,int idx)
{
if(l==r)
{
tr[o][idx].mi=tr[o][idx].mx=tmp[l][idx];
return;
}
build(lson,l,m,idx);
build(rson,m+,r,idx);
pushup(o,idx);
}
void update(int o,int l,int r,int x,int idx)
{
if(l==r)
{
tr[o][idx].mi=tr[o][idx].mx=tmp[l][idx];
return;
}
if(x<=m) update(lson,l,m,x,idx);
else update(rson,m+,r,x,idx);
pushup(o,idx);
}
int query(int o,int l,int r,int ql,int qr,int mark,int idx)
{
if(ql<=l&&qr>=r)
{
if(mark==)
return tr[o][idx].mi;
else
return tr[o][idx].mx;
}
if(qr<=m)
return query(lson,l,m,ql,qr,mark,idx);
if(ql>m)
return query(rson,m+,r,ql,qr,mark,idx);
if(mark==)
return min(query(lson,l,m,ql,qr,mark,idx),query(rson,m+,r,ql,qr,mark,idx));
else
return max(query(lson,l,m,ql,qr,mark,idx),query(rson,m+,r,ql,qr,mark,idx));
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
for(int j=;j<k;j++)
scanf("%d",&a[i][j]);
cal(n,k);
int q;
scanf("%d",&q);
while(q--)
{
int op;
scanf("%d",&op);
if(op==)
{
int x;
scanf("%d",&x);
for(int i=;i<k;i++)
scanf("%d",&a[x][i]);
cal2(x,n,k);
}
else
{
int l,r;
scanf("%d%d",&l,&r);
int ans=;
for (int s = ; s < (<<k) ; s ++)
{
int mi=1e9;
int mx=-1e9;
mi=min(mi,query(,,n,l,r,,s));
mx=max(mx,query(,,n,l,r,,s));
ans=max(ans,mx-mi);
}
printf("%d\n",ans);
}
}
}

Codeforces 1093G题解(线段树维护k维空间最大曼哈顿距离)的更多相关文章

  1. 线段树区间合并+k维空间的曼哈顿距离——cf1093G好题

    和去年多校的CSGO一样,用状态压缩来求Manhattan距离的最大值 然后要用线段树维护一下区间最大值 /* k维空间给定n个点,两个操作 1 i b1 b2 .. bk : 修改第i个点的坐标 2 ...

  2. CodeForces - 1093G:Multidimensional Queries (线段树求K维最远点距离)

    题意:给定N个K维的点,Q次操作,或者修改点的坐标:或者问[L,R]这些点中最远的点. 思路:因为最后一定可以表示维+/-(x1-x2)+/-(y1-y2)+/-(z1-z2)..... 所以我们可以 ...

  3. CodeForces - 1263E(线段树维护前缀和最值)

    题意 https://vjudge.net/problem/CodeForces-1263E 您要设计一个只有一行的打字机,这一行的长度是无限大,一开始可以认为每个字符都是空.您的打字机有一个光标只指 ...

  4. 洛谷 P4198 楼房重建 线段树维护单调栈

    P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上 ...

  5. 【uoj#164】[清华集训2015]V 线段树维护历史最值

    题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并 ...

  6. 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值

    题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...

  7. CF877E Danil and a Part-time Job 线段树维护dfs序

    \(\color{#0066ff}{题目描述}\) 有一棵 n 个点的树,根结点为 1 号点,每个点的权值都是 1 或 0 共有 m 次操作,操作分为两种 get 询问一个点 x 的子树里有多少个 1 ...

  8. Codeforces 834D The Bakery【dp+线段树维护+lazy】

    D. The Bakery time limit per test:2.5 seconds memory limit per test:256 megabytes input:standard inp ...

  9. Codeforces 1368H - Breadboard Capacity(最小割+线段树维护矩阵乘法)

    Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 首先看到这种从某一种颜色 ...

随机推荐

  1. v-for的深层用法

    为了提升循环的性能,我们会给循环加上一个唯一的key值,这个key值一定是唯一的 <div id='root'> <div v-for='(item,index) of list' ...

  2. php中的脚本加速扩展opcache

    今儿在azure里装php5.5.4,发现原先php5.4.php5.3中的zend guard laoder以及php5.2中的Zend Optimizer均不能再用,一直很喜欢用的eacceler ...

  3. CDH4.5.0源代码编译

    Unable to load native-hadoop library for your platform解决 安装maven 1 cmake-2.8.12.1.tar.gz cd cmake-2. ...

  4. zen-Coding在Notepad++中的使用

    zen-Coding是一款快速编写HTML,CSS(或其他格式化语言)代码的编辑器插件,这个插件可以用缩写方式完成大量重复的编码工作,是web前端从业者的利器. zen-Coding插件支持多种编辑器 ...

  5. C#中this保留字的用法

    一.this保留字 this保留字一般只在构造函数.类的方法和类的实例中使用.它有以下含义: ?在类的构造函数中出现的this,则作为一个值类型,表示对正在构造的对象本身的引用. ?在类的方法中出现的 ...

  6. 清除ie10+浏览器的input输入框后面会出现的x号和闭眼logo

    x号:::-ms-clear{display:none;} 闭眼logo: ::-ms-reveal{display:none;} tips:如果在外部引用的css里面没有作用,可以在写本页面的< ...

  7. Oracle必备知识.

    一.基本数据类型 1.字符数据类型 char    varchar2    long 三者区别:  I.char固定长度字符串,存储字母数字值,列长度可以是 1 到 2000 个字节. II.varc ...

  8. Angular/cli的安装

    Angular cli 是一个命令行工具,用来创建,打包,发布项目. Angular cli 安装之前必须先安装Node 6.9.0及以上版本,NPM 3 及以上版本. 在cmd控制台窗口执行命令no ...

  9. ES6初识-模块化

    export let A=123; export function test(){ console.log('test'); } export class Hello(){ test(){ conso ...

  10. js、jquery中全局替换replace

    str.replace(/需要替换的/g,"新字符串") //此处使用正则表达式