题意是,给出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. mysql [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GRO

    [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c ...

  2. jQuery实现轮播切换以及将其封装成插件(2)

    在上一篇博文中,我们完成了一个简单的轮播切换.它的功能比较简单,仅仅能定时切换图片. 但是有没有这样一种情况.当我们特意的想看某一个轮播显示项时不希望等轮播一圈才能等到,希望通过图上的一些元素,触发某 ...

  3. HttpServerUtility 和 HttpUyility

    参考:msdn HttpServerUtility 提供用于处理 Web 请求的 Helper 方法. 2017/08/07            加密解码 这个类没有构造函数,所以不能直接new. ...

  4. ZJOI2019Round#2

    乱听课记录 关于树的分治问题&杂题选讲 张哲宇 边分治 (边分不是很鸡肋吗) 例题一 题目大意:给出两颗有正负边权的树,求出两个点\(u,v​\)使得两棵树中\((u,v)​\)距离的和最大. ...

  5. MySQL 如何查看及修改数据库引擎

    MySQL 如何查看及修改数据库引擎 1.查看mysql支持的引擎有哪些 show engines 结果,如图所示: 由上图可以看出,只有InnoDB是支持事务的 2.查看当前默认的引擎 show v ...

  6. 关于TP3.2框架读取Sql server中文字段数据以及处理乱码的一些小心得

    最近要做一个项目,需要使用TP3.2框架,之前什么也不会,就硬着头皮上了,结果真的闹了挺多emmmmmm挺低级的错误,就像SQL Server中文字段的读取,一开始我是照着读取英文字段的格式来写的,在 ...

  7. 基于appium的app自动化测试框架

    基于appium框架的app自动化测试 App自动化测试主要难点在于环境的搭建,appium完全是基于selenium进行的扩展,所以app测试框架也是基于web测试框架开发的 一.设备连接 (即构建 ...

  8. The Extinction of Some Languages【一些语言的消失】

    The Extinction of Some Languages Languages have been coming and going for thousands of years, 语言的产生和 ...

  9. C语言数组篇(四)二维数组

      二维数组声明: ][] ={{,,},{,,}; //两行 三列         二维数组在声明的时候可以不写行,但一定要写列 ] = {{,},{,,},{}}; //未声明的地方自动补零 二维 ...

  10. 分离链接法(Separate Chaining)

    之前我们说过,对于需要动态维护的散列表 冲突是不可避免的,无论你的散列函数设计的有多么精妙.因此我们解决的重要问题就是:一旦发生冲突,我们该如何加以排解? 我们在这里讨论最常见的两种方法:分离链接法和 ...