题意是,给出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. c++参数传递的三种方式

    一般来说C++中参数传递有三种方式:值传递.指针传递.引用传递 1.值传递——传值 值传递是最常见的一种参数传递的方式,但是对初学者来说也最容易出错.如下例: #include<iostream ...

  2. django.template.exceptions.TemplateSyntaxError: 'article_tags' is not a registered tag library.

    django.template.exceptions.TemplateSyntaxError: 'article_tags' is not a registered tag library. Must ...

  3. jeDate日期控件

    http://www.jayui.com/jedate/     这是日期控件官网,可以去里面下载使用 前台 <%@ Page Language="C#" AutoEvent ...

  4. windows安装配置mongodb及图形工具MongoVUE

    解压安装包到D:\Program Files\mongodb 建立数据库目录 D:\Program Files\mongodb\data 建立日志目录 D:\Program Files\mongodb ...

  5. 转载:字符串HASH

    转载自:Slager_Z 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; ...

  6. 一、小程序连接MySql数据库

    前言:我用的是wafer2 node.解决方案 下面连接有环境配置及搭建流程(https://github.com/tencentyun/wafer2-quickstart-nodejs) ,连接是官 ...

  7. 使用Jmeter性能测试,读取csv文件时的乱码问题

    读取csv参数乱码问题 发送请求时参数通过CSV文件读取,发送请求后显示错误,把获取的参数通过在线urlencode转码器转码后发现是乱码.打开csv设值,编码格式选择的是UTF-8,打开参数文件后发 ...

  8. JS提示Cannot read property 'replace' of undefined

    出现这个错误的原因一般是传的参数为null 在传参之前加个是否为null的判断就行了.

  9. ubuntu16 升级pip3后报错File "/usr/bin/pip3", line 9, in <module> from pip import main ImportError: cannot import name 'main'

    问题:ubuntu16 执行pip3 install --upgrade pip之后,pip3执行出错. Traceback (most recent call last): File "/ ...

  10. JAVA / MySql 编程——第七章 JDBC

    1.JDBC:JDBA是Java数据库连接(Java DataBase Connectivity)技术的简称,提供连接各种常用数据库的能力:         ●Java是通过JDBC技术实现对各种数据 ...