[CF1093G]Multidimensional Queries

[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;
}

转载于:https://www.cnblogs.com/skylee03/p/10397307.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 多维缩放(Multidimensional Scaling)是一种数据分析方法,用于将高维数据转换为低维空间中的点,以便更好地理解和可视化数据之间的相似性和差异性。它可以用于各种领域,如心理学、社会学、市场研究和生物学等。多维缩放可以通过计算数据点之间的距离或相似性矩阵来实现。 ### 回答2: 多维缩放法(multidimensional scaling,MDS),是一种常用的数据分析技术,用于在低维空间中表示高维度数据,通常用于探索几何学特征和比较数据之间的相似性。该技术可将复杂的关系和结构可视化为二维或三维图形,从而使我们更容易理解和解释数据。 多维缩放法主要用于探究数据集内不同组或对象之间的相似性和差异性,基于它们之间的距离或相似性结果。可分为两种类型:度量MDS和非度量MDS。度量MDS假定距离是可度量的,且高维数据的距离可以在低维空间中重现。非度量MDS假定距离是无序的,且无法准确地反映高维数据之间的距离。 要使用多维缩放法,首先需要获得有关对象之间距离或相似性的数据。比如当人们在做一个品牌调查时,想要了解不同品牌之间的相似性和差异性,就需要先收集关于消费者对每个品牌的与众不同程度的概率数据,然后利用多维缩放法,将数据转换为映射低维空间中的点,可以发现在低维空间中,与众不同程度较高的品牌往往会聚集在一起,这样的模型更易于理解和分析。 多维缩放法还有其他重要应用案例。在生物学领域,它可以用于研究生物物种之间的相似性和演化类别的结构。在心理学领域,它可以用于研究人们对不同对象或概念之间的感知和判别,以及评估人类语言语调的范围和结构。 总之,多维缩放法是一种简单而强大的分析工具,可以帮助探索和理解不同数据之间的相似性和差异性,找出数据点之间的潜在关系和结构,为后续研究和应用提供宝贵的指导。 ### 回答3: 多维缩放(又称为MDS)是一种统计学方法,用于评估数据集中各项之间的距离或相似度。MDS可以将数据集中的对象(如文本文档、图像或音频片段)映射到二维或三维空间,从而创建一个可视化表示。MDS的目的是通过将数据点映射到较低维度空间中的布局来展示数据集中对象的相似性和差异性,以便进一步分析。 最常见的MDS方法是基于距离矩阵的。在这种方法中,每对对象之间的距离被计算并表示为一个矩阵。MDS将该距离矩阵转换为低维度空间中的点,并通过最小化在低维度空间中的点之间的距离与原始距离矩阵之间的差异来找到合适的布局。 MDS在许多领域都得到了广泛的应用。在市场研究中,MDS可用于分析消费者对产品的偏好,而在物理空间中,MDS可用于研究分子之间的相似性。此外,MDS还被广泛用于可视化大型数据集中的关系和模式,包括社交网络分析、文本分析和数据挖掘。通过可视化数据集中的对象之间的相似性和差异性,MDS使得分析人员能够更好地理解复杂的数据结构和关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值