和去年多校的CSGO一样,用状态压缩来求Manhattan距离的最大值

然后要用线段树维护一下区间最大值

/*
k维空间给定n个点,两个操作
1 i b1 b2 .. bk : 修改第i个点的坐标
2 l r:询问[l,r]区间点最大的曼哈顿距离 先考虑不带修:
线段树维护区间2^5种状态的最大值
查询时只要求出相对的两个状态的最大值即可 关于这个贪心的证明:
首先因为绝对值,所以aij前面带的符号可能是-也可能是+,总共就是有关2^k种可能
那么考虑每种状态 S 的最大值,加上相对这种状态 (1<<k)-S 的最大值,来维护答案
其实会有很多情况是不应该存在的,比如aij是第j维最小的,那么其前面的符号就只能是-
可是当其前面的符号是+时也被考虑进去了,其实能够保证另有一个数比这种情况大
即这种情况对结果不造成影响 再来考虑待修的情况
修改pos位置的点,就要去线段树中更新和这个点有关的2^5种状态 所以还是线段树维护区间最大值的问题,可以用一个结点来维护
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
int k,n,m,a[maxn][],v[maxn][<<]; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct Node{int Max,val[<<];}p[maxn<<];
void pushup(int rt){
for(int i=;i<(<<);i++)
p[rt].val[i]=max(p[rt<<].val[i],p[rt<<|].val[i]);
p[rt].Max=-0x3f3f3f3f;
for(int i=;i<(<<);i++)
p[rt].Max=max(p[rt].Max,p[rt].val[i]+p[rt].val[(<<)--i]);
}
void build(int l,int r,int rt){
if(l==r){
for(int i=;i<(<<);i++){
p[rt].val[i]=v[l][i];
// p[rt].Max=max(p[rt].Max,v[l][i]);
}
return;
}
int m=l+r>>;
build(lson);build(rson);
pushup(rt);
}
void update(int pos,int l,int r,int rt){//更新第pos个点
if(l==r){
for(int i=;i<(<<);i++)
p[rt].val[i]=v[l][i];
return;
}
int m=l+r>>;
if(pos<=m)update(pos,lson);
else update(pos,rson);
pushup(rt);
}
Node merge(Node a,Node b){
for(int i=;i<(<<);i++)
a.val[i]=max(a.val[i],b.val[i]);
for(int i=;i<(<<);i++)
a.Max=max(a.Max,a.val[i]+b.val[(<<)-i-]);
return a;
}
Node query(int L,int R,int l,int r,int rt){
if(L<=l && R>=r)
return p[rt];
int m=l+r>>;
Node res;
for(int i=;i<(<<);i++)
res.val[i]=-0x3f3f3f3f;
res.Max=-0x3f3f3f3f; if(L<=m)
res=merge(res,query(L,R,lson));
if(R>m)
res=merge(res,query(L,R,rson));
return res;
} int main(){
cin>>n>>k;
for(int i=;i<=n;i++){
for(int j=;j<k;j++)
scanf("%d",&a[i][j]); for(int S=;S<(<<);S++){
for(int j=;j<;j++)
if(S&(<<j))v[i][S]+=a[i][j];
else v[i][S]-=a[i][j];
}
} build(,n,); cin>>m;
int op,l,r,pos;
while(m--){
scanf("%d",&op);
if(op==){
scanf("%d",&pos);
for(int i=;i<k;i++)
scanf("%d",&a[pos][i]);
for(int S=;S<(<<);S++){
v[pos][S]=;
for(int j=;j<;j++)
if(S&(<<j))
v[pos][S]+=a[pos][j];
else v[pos][S]-=a[pos][j];
}
update(pos,,n,);
}
else {
scanf("%d%d",&l,&r);
Node node=query(l,r,,n,);
cout<<node.Max<<'\n';
}
}
}

线段树区间合并+k维空间的曼哈顿距离——cf1093G好题的更多相关文章

  1. Codeforces 1093G题解(线段树维护k维空间最大曼哈顿距离)

    题意是,给出n个k维空间下的点,然后q次操作,每次操作要么修改其中一个点的坐标,要么查询下标为[l,r]区间中所有点中两点的最大曼哈顿距离. 思路:参考blog:https://blog.csdn.n ...

  2. POJ 2482 Stars in Your Window (线段树区间合并+扫描线)

    这题开始一直被矩形框束缚了,想法一直都是枚举线,但是这样枚举都需要O(n^2)...但是看了别人的思路,感觉这题思想真心很好(PS:开头好浪漫的描述啊,可惜并没有什么用)  题意就是在平面上给你一些星 ...

  3. poj3667 线段树 区间合并

    //Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  4. hdu3911 线段树 区间合并

    //Accepted 3911 750MS 9872K //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  5. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

  6. hdu-3308 LCIS (线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. hdu 3308(线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. 【bzoj2325】[ZJOI2011]道馆之战 树链剖分+线段树区间合并

    题目描述 给定一棵树,每个节点有上下两个格子,每个格子的状态为能走或不能走.m次操作,每次修改一个节点的状态,或询问:把一条路径上的所有格子拼起来形成一个宽度为2的长方形,从起点端两个格子的任意一个开 ...

  9. 【BZOJ3638】Cf172 k-Maximum Subsequence Sum 线段树区间合并(模拟费用流)

    [BZOJ3638]Cf172 k-Maximum Subsequence Sum Description 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交 ...

随机推荐

  1. 将Java和Javac的命令在控制台的输出重定向到txt文件

    当我们在Windows控制台窗口执行程序时,输入如下命令: demo.exe > out.txt 就可以把demo程序的输出重定向到out.txt文件里面. 但是这种方法对于java和javac ...

  2. 预防定时重启apache服务没有起来的脚本

    内容如下: #!/bin/bash test=$(ps aux | grep httpd | grep -v grep) if [ -n "$test" ] then echo & ...

  3. HashMap和Hashtable有什么区别

    HashMap和Hashtable都实现了Map接口,因此很多特性非常相似.但是,他们有以下不同点: HashMap允许键和值是null,而Hashtable不允许键或者值是null. Hashtab ...

  4. 16. 继承(extends)

    1.语法 class 类名1 extends 类名2{ //成员变量和成员方法 } 2.继承要注意的事项: 1)千万不要为了减少重复代码而去继承,只有真正存在着继承关系的时候才去继承. 2)父类私有的 ...

  5. Redis探索之路(六):Redis的常用命令

    一:键值相关命令 1.keys Pattern模糊查询 keys my* 2.exists某个key是否存在 exists key1 3.del 删除一个key del key1 4.expire设置 ...

  6. Batch - 重定向符号Redirection >

    总结 Don't use a piping operator, which is what ">" Redirection is. 不要使用管道运算符,即“>”. Di ...

  7. Python获取房价信息和导出EXCEL

    房价与生活息息相关,那么各地区房价情况和差别咋样呢?  可以打开网站或手机APP去查询一下,不过查看到的数据有限,很不过瘾~ 作为一个合格的程序员,要懂得用代码解决问题! 第一步:打开一个房产交易平台 ...

  8. thinkphp 标签库驱动

    任何一个模板引擎的功能都不可能是为你量身定制的,具有一个良好的可扩展机制也是模板引擎的另外一个考量,Smarty采用的是插件方法来实现扩展,Think\Template由于采用了标签库技术,比Smar ...

  9. PHP ftp_rename() 函数

    定义和用法 ftp_rename() 函数重命名 FTP 服务器上的文件或目录. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_rename(ftp_connectio ...

  10. JavaWeb学习篇之----web应用的虚拟目录映射和主机搭建(Tomcat)

    从今天开始来学习JavaWeb的相关知识,之前弄过一段时间JavaWeb的,就是在做毕业设计的时候搞过,但是那时候完全是为了任务去学习,所以效果不好,好多东西都没有深入的研究过,所以接下来的一段时间我 ...