[CF1093G]Multidimensional Queries

题目大意:

\(k(k\le5)\)维空间中有\(n(n\le2\times10^5)\)个点。\(m\)次操作,操作包含一下两种:

  1. 将第\(i\)个点改为\((b_1,b_2,\ldots,b_k)\)。
  2. 询问编号在\([l,r]\)内的所有点对中,曼哈顿距离的最大值。

思路:

枚举每一维坐标对答案的贡献的符号是正还是负,总共\(2^{k-1}\)种情况。每种情况用线段树维护最大/最小值。询问时在每棵线段树上查询区间最大值-区间最小值,对所有的情况取最大值即可。

时间复杂度\(\mathcal O(2^kn\log n)\)。

源代码:

#include<cstdio>
#include<cctype>
#include<climits>
#include<algorithm>
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) neg|=ch=='-';
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return neg?-x:x;
}
const int N=2e5+1,K=5;
int n,k,a[K];
class SegmentTree {
#define _left <<1
#define _right <<1|1
#define mid ((b+e)>>1)
private:
int max[N<<2],min[N<<2];
void push_up(const int &p) {
max[p]=std::max(max[p _left],max[p _right]);
min[p]=std::min(min[p _left],min[p _right]);
}
public:
void modify(int p,const int &y) {
max[p]=min[p]=y;
while(p!=1) {
p>>=1;
push_up(p);
}
}
int qmax(const int &p,const int &b,const int &e,const int &l,const int &r) const {
if(b==l&&e==r) return max[p];
int ret=INT_MIN;
if(l<=mid) ret=std::max(ret,qmax(p _left,b,mid,l,std::min(mid,r)));
if(r>mid) ret=std::max(ret,qmax(p _right,mid+1,e,std::max(mid+1,l),r));
return ret;
}
int qmin(const int &p,const int &b,const int &e,const int &l,const int &r) const {
if(b==l&&e==r) return min[p];
int ret=INT_MAX;
if(l<=mid) ret=std::min(ret,qmin(p _left,b,mid,l,std::min(mid,r)));
if(r>mid) ret=std::min(ret,qmin(p _right,mid+1,e,std::max(mid+1,l),r));
return ret;
}
#undef _left
#undef _right
#undef mid
};
SegmentTree t[1<<K];
inline int query(const int &s,const int &l,const int &r) {
return t[s].qmax(1,1,n,l,r)-t[s].qmin(1,1,n,l,r);
}
inline int find(const int &x) {
int b=1,e=n,p=1;
while(b<e) {
const int mid=(b+e)>>1;
if(x<=mid) {
e=mid;
p=p<<1;
} else {
b=mid+1;
p=p<<1|1;
}
}
return p;
}
int main() {
n=getint(),k=getint();
for(register int i=1;i<=n;i++) {
for(register int i=0;i<k;i++) a[i]=getint();
const int pos=find(i);
for(register int s=0;s<1<<(k-1);s++) {
int val=0;
for(register int j=0;j<k;j++) {
val+=a[j]*(s>>j&1?:-1);
}
t[s].modify(pos,val);
}
}
const int q=getint();
for(register int i=0;i<q;i++) {
const int opt=getint();
if(opt==1) {
const int x=getint(),pos=find(x);
for(register int i=0;i<k;i++) a[i]=getint();
for(register int s=0;s<1<<(k-1);s++) {
int val=0;
for(register int j=0;j<k;j++) {
val+=a[j]*(s>>j&1?:-1);
}
t[s].modify(pos,val);
}
}
if(opt==2) {
const int l=getint(),r=getint();
int ans=0;
for(register int s=0;s<1<<(k-1);s++) {
ans=std::max(ans,query(s,l,r));
}
printf("%d\n",ans);
}
}
return 0;
}

[CF1093G]Multidimensional Queries的更多相关文章

  1. [CF1093G]Multidimensional Queries 题解

    前言 DennyQi太巨了! 定义一个点\(a\),\(a_x\)表示\(a\)在第\(x\)维空间上的坐标值 题解 这题的思路珂以说非常巧妙(原谅我又用了这个"珂"), 我们知道 ...

  2. [CF1093G]Multidimensional Queries:线段树

    分析 非常有趣的一道题. 式子中的绝对值很难处理,但是我们发现: \[\sum_{i=1}^{k}|a_{x,i}-a_{y,i}|=\sum_{i=1}^{k}max(a_{x,i}-a_{y,i} ...

  3. CF 1093 G. Multidimensional Queries

    G. Multidimensional Queries 链接 分析: 考虑如何去掉绝对值符号. $\sum \limits_{i = 1}^{k} |a_{x, i} - a_{y, i}|$,由于k ...

  4. POJ-2926-Requirements&&Educational Codeforces Round 56G. Multidimensional Queries 【哈夫曼距离】

    POJ2926 先学会这个哈夫曼距离的处理才能做 cf 的G #include <iostream> #include <stdio.h> #include <algor ...

  5. codeforces1093G Multidimensional Queries 【线段树】

    题目分析: 搜索2^k种情况,线段树分别处理就行了,正确性明显. 代码: #include<bits/stdc++.h> using namespace std; ; int n,k; ] ...

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

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

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

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

  8. CF 1093G Multidimensional Queries——线段树(消去绝对值符号)

    题目:http://codeforces.com/contest/1093/problem/G 只好看看题解:https://codeforces.com/blog/entry/63877 主要是把绝 ...

  9. [AGC034D]Manhattan Max Matching:费用流

    前置姿势 \(k\)维空间内两点曼哈顿距离中绝对值的处理 戳这里:[CF1093G]Multidimensional Queries 多路增广的费用流 据说这个东西叫做ZKW费用流? 流程其实很简单, ...

随机推荐

  1. PMP知识点(五)——配置管理

    配置控制重点关注可交付成果及各个过程的技术规范,而变更控制则着眼于识别.记录.批准或否决对项目文件,可交付成果或基准的变更. 包括在实施整体变更控制过程中的部分配置管理活动有: 1.配置识别. 识别与 ...

  2. Python——built-in module Help: math

    Help on built-in module math: NAME math DESCRIPTION This module is always available. It provides acc ...

  3. Groovy闭包详解

    Groovy闭包是一种可执行代码块的方法,闭包也是对象,可以向方法一样传递参数,因为闭包也是对象,因此可以在需要的时候执行,像方法一样闭包可以传递一个或多个参数.闭包最常见的用途就是处理集合,可以遍历 ...

  4. 第四周WordCount优化

    一.GitHub地址 https://github.com/kawoyi/Advanced-WordCounter最终由组长整合的组长github 二.psp表格 三.个人模块及实现 我负责的是输入模 ...

  5. box-shaw四边阴影详解

    四边设置: /*设置四边不同颜色外阴影*/ .element{ box-shadow:-10px 0 10px red, /*左边阴影*/ 10px 0 10px yellow, /*右边阴影*/ 0 ...

  6. Oracle 数据库基础知识

    depyno 部门编号 部门表 dname 部门名称 location 地址----------------------------------------empno 员工编号 员工表ename 员工 ...

  7. LeetCode第十六题-找出数组中三数之和最接近目标值的答案

    3Sum Closest 问题简介: 给定n个整数的数组nums和整数目标,在nums中找到三个整数,使得总和最接近目标,返回三个整数的总和,可以假设每个输入都只有一个解决方案 举例: 给定数组:nu ...

  8. 20175204 张湲祯 2018-2019-2《Java程序设计》2

    20175204 张湲祯 2018-2019-2<Java程序设计>2 必做课下作业MyCP 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP ...

  9. Django-CSRF,AJAX,FORM

    内容总览1.CSRF相关1>CSRF源码分析2>ajax的实现(ajax的实例(异步计算,参数测试,上传))3>ajax通过csrf的校验 2.FORM组件1>基本使用2> ...

  10. Beta 冲刺(7/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(7/7) 后敬甲(组长) 过去两天完成了哪些任务 ppt制作 视频拍摄 接下来的计划 准备答辩 还剩下哪些 ...