Codeforces 1093G题解(线段树维护k维空间最大曼哈顿距离)
题意是,给出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维空间最大曼哈顿距离)的更多相关文章
- 线段树区间合并+k维空间的曼哈顿距离——cf1093G好题
和去年多校的CSGO一样,用状态压缩来求Manhattan距离的最大值 然后要用线段树维护一下区间最大值 /* k维空间给定n个点,两个操作 1 i b1 b2 .. bk : 修改第i个点的坐标 2 ...
- CodeForces - 1093G:Multidimensional Queries (线段树求K维最远点距离)
题意:给定N个K维的点,Q次操作,或者修改点的坐标:或者问[L,R]这些点中最远的点. 思路:因为最后一定可以表示维+/-(x1-x2)+/-(y1-y2)+/-(z1-z2)..... 所以我们可以 ...
- CodeForces - 1263E(线段树维护前缀和最值)
题意 https://vjudge.net/problem/CodeForces-1263E 您要设计一个只有一行的打字机,这一行的长度是无限大,一开始可以认为每个字符都是空.您的打字机有一个光标只指 ...
- 洛谷 P4198 楼房重建 线段树维护单调栈
P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上 ...
- 【uoj#164】[清华集训2015]V 线段树维护历史最值
题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并 ...
- 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值
题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...
- CF877E Danil and a Part-time Job 线段树维护dfs序
\(\color{#0066ff}{题目描述}\) 有一棵 n 个点的树,根结点为 1 号点,每个点的权值都是 1 或 0 共有 m 次操作,操作分为两种 get 询问一个点 x 的子树里有多少个 1 ...
- 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 ...
- Codeforces 1368H - Breadboard Capacity(最小割+线段树维护矩阵乘法)
Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 首先看到这种从某一种颜色 ...
随机推荐
- c++参数传递的三种方式
一般来说C++中参数传递有三种方式:值传递.指针传递.引用传递 1.值传递——传值 值传递是最常见的一种参数传递的方式,但是对初学者来说也最容易出错.如下例: #include<iostream ...
- 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 ...
- jeDate日期控件
http://www.jayui.com/jedate/ 这是日期控件官网,可以去里面下载使用 前台 <%@ Page Language="C#" AutoEvent ...
- windows安装配置mongodb及图形工具MongoVUE
解压安装包到D:\Program Files\mongodb 建立数据库目录 D:\Program Files\mongodb\data 建立日志目录 D:\Program Files\mongodb ...
- 转载:字符串HASH
转载自:Slager_Z 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; ...
- 一、小程序连接MySql数据库
前言:我用的是wafer2 node.解决方案 下面连接有环境配置及搭建流程(https://github.com/tencentyun/wafer2-quickstart-nodejs) ,连接是官 ...
- 使用Jmeter性能测试,读取csv文件时的乱码问题
读取csv参数乱码问题 发送请求时参数通过CSV文件读取,发送请求后显示错误,把获取的参数通过在线urlencode转码器转码后发现是乱码.打开csv设值,编码格式选择的是UTF-8,打开参数文件后发 ...
- JS提示Cannot read property 'replace' of undefined
出现这个错误的原因一般是传的参数为null 在传参之前加个是否为null的判断就行了.
- 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 "/ ...
- JAVA / MySql 编程——第七章 JDBC
1.JDBC:JDBA是Java数据库连接(Java DataBase Connectivity)技术的简称,提供连接各种常用数据库的能力: ●Java是通过JDBC技术实现对各种数据 ...