题目:http://codeforces.com/contest/1093/problem/G

只好看看题解:https://codeforces.com/blog/entry/63877

主要是把绝对值符号消掉,变成枚举正负。因为答案不会变差,所以不用管符号应该是什么,直接对应地取 max 、 min 即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ls Ls[cr]
#define rs Rs[cr]
using namespace std;
const int N=2e5+5,M=N<<1,K=10,tK=35,INF=5e6+5;
int n,k,lm,bin[K],Q,a[N][K],tot,Ls[M],Rs[M];
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;}
struct Node{
int mx[tK],mn[tK];
Node operator+ (const Node &b)const
{
Node c;
for(int i=0;i<lm;i++)
{
c.mx[i]=Mx(mx[i],b.mx[i]);
c.mn[i]=Mn(mn[i],b.mn[i]);
}
return c;
}
}sm[M];
int rdn()
{
int ret=0;bool fx=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}
while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();
return fx?ret:-ret;
}
void dfs(int cr,int lj,int s,int id,int bh)
{
if(cr>k)
{
sm[bh].mn[s]=sm[bh].mx[s]=lj;
return;
}
dfs(cr+1,lj+a[id][cr],s|bin[cr],id,bh);
dfs(cr+1,lj-a[id][cr],s,id,bh);
}
void build(int l,int r,int cr)
{
if(l==r){dfs(1,0,0,l,cr);return;}
int mid=l+r>>1;
ls=++tot;build(l,mid,ls);
rs=++tot;build(mid+1,r,rs);
sm[cr]=sm[ls]+sm[rs];
}
void updt(int l,int r,int cr,int p)
{
if(l==r){dfs(1,0,0,l,cr);return;}
int mid=l+r>>1;
if(p<=mid)updt(l,mid,ls,p);
else updt(mid+1,r,rs,p);
sm[cr]=sm[ls]+sm[rs];
}
Node query(int l,int r,int cr,int L,int R)
{
if(l>=L&&r<=R)return sm[cr];
int mid=l+r>>1;
if(L>mid)return query(mid+1,r,rs,L,R);
if(R<=mid)return query(l,mid,ls,L,R);
return query(l,mid,ls,L,R)+query(mid+1,r,rs,L,R);
}
int main()
{
n=rdn();k=rdn();lm=(1<<k);
bin[1]=1;for(int i=2;i<=k;i++)bin[i]=bin[i-1]<<1;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)a[i][j]=rdn();
tot=1;build(1,n,1);
Q=rdn();
for(int i=1,op,id,l,r;i<=Q;i++)
{
op=rdn();
if(op==1)
{
id=rdn();
for(int j=1;j<=k;j++)a[id][j]=rdn();
updt(1,n,1,id);
}
else
{
l=rdn();r=rdn();
Node d=query(1,n,1,l,r);int ans=-INF;
for(int i=0;i<lm;i++)
ans=Mx(ans,d.mx[i]-d.mn[i]);
printf("%d\n",ans);
}
}
return 0;
}

CF 1093G Multidimensional Queries——线段树(消去绝对值符号)的更多相关文章

  1. HDU 4027 Can you answer these queries? (线段树区间修改查询)

    描述 A lot of battleships of evil are arranged in a line before the battle. Our commander decides to u ...

  2. CF 1023D Array Restoration - 线段树

    题解 非常容易想到的线段树, 还可以用并查集来. 还有一位大神用了$O(n)$ 就过了Orz 要判断是否能染色出输入给出的序列,必须满足两个条件: 1. 序列中必须存在一个$q$ 2. 两个相同的数$ ...

  3. hdu 4027 Can you answer these queries? 线段树区间开根号,区间求和

    Can you answer these queries? Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/sho ...

  4. CF 787D Legacy(线段树思想构图+最短路)

    D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  5. Light OJ-1082 - Array Queries,线段树区间查询最大值,哈哈,水过~~

                                                                                                        ...

  6. HDU4027 Can you answer these queries? —— 线段树 区间修改

    题目链接:https://vjudge.net/problem/HDU-4027 A lot of battleships of evil are arranged in a line before ...

  7. HDU-4027-Can you answer these queries?线段树+区间根号+剪枝

    传送门Can you answer these queries? 题意:线段树,只是区间修改变成 把每个点的值开根号: 思路:对[X,Y]的值开根号,由于最大为 263.可以观察到最多开根号7次即为1 ...

  8. Codeforces Round #590 (Div. 3) D. Distinct Characters Queries(线段树, 位运算)

    链接: https://codeforces.com/contest/1234/problem/D 题意: You are given a string s consisting of lowerca ...

  9. HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)

    题目 线段树 简单题意: 区间(单点?)更新,区间求和  更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都 ...

随机推荐

  1. RocketMQ学习分享

    消息队列的流派 什么是 MQ Message Queue(MQ),消息队列中间件.很多人都说:MQ 通过将消息的发送和接收分离来实现应用程序的异步和解偶,这个给人的直觉是——MQ 是异步的,用来解耦的 ...

  2. 重新学习MySQL数据库8:MySQL的事务隔离级别实战

    重新学习Mysql数据库8:MySQL的事务隔离级别实战 在Mysql中,事务主要有四种隔离级别,今天我们主要是通过示例来比较下,四种隔离级别实际在应用中,会出现什么样的对应现象. Read unco ...

  3. Python之路,Day8 - 面向对象编程进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...

  4. zk的watcher机制的实现

    转载:https://www.ibm.com/developerworks/cn/opensource/os-cn-apache-zookeeper-watcher/ http://blog.csdn ...

  5. MYSQL-实现分组排序 对比 ORACLE 和SQLserver用 row_number() over(partition by ) 分组排序功能

    以下是个人笔记: 本文是为了理解 row_number() over(partition by )  和实现各种数据库的分组排序功能 select ROW_NUMBER()over( partitio ...

  6. 十九、dbms_resource_manager(用于维护资源计划,资源使用组和资源计划指令)

    1.概述 作用:用于维护资源计划,资源使用组和资源计划指令;包dbms_resource_manager_privs用于维护与资源管理相关的权限. 2.包的组成 1).dbms_resource_ma ...

  7. cookies分类

    Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie. 内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的.硬盘Cooki ...

  8. flask 文件的上传下载和excel操作

    文件的下载 from flask import send_from_directory @excel_bp.route('/get_attachment/<path:filename>') ...

  9. c++多线程在异常环境下的等待

    c++11开始支持多线程编程,相关的类和函数封装在标准库头文件<thread>中,而c++多线程编程很重要的一点就是当用户创建一个std::thread对象,关联了可调用对象后,需要在该t ...

  10. Kotlin Reference (三) Coding Conventions

    most from reference 命名规则 1.使用驼峰式命名规则,尽量避免在命名中使用下划线 2.类型以大写字母开头 3.方法和属性以小写字母开头 4.使用4个空格缩进 5.public的方法 ...