https://hihocoder.com/problemset/problem/1586

线段树操作,原来题并不难。。。。。

当时忽略了一个重要问题,就是ax*ay要最小时,x、y可以相等,那就简单了!结果显然是模最小的数的平方或者是个负数。

要求乘积最小只要求区间内最大值、最小值和绝对值小的数,再判断min,max正负就行了。

下面的代码相当于建了三个树分别存Min,Max,Mid(abs(Min))

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
typedef long long ll;
const int maxn=(<<)+;
int Max[maxn<<],Min[maxn<<],Mid[maxn<<]; int mid(int a,int b)
{
if(abs(a)<abs(b)) return a;
else return b;
} void PushUpMax(int rt)
{
Max[rt]=max(Max[rt<<],Max[rt<<|]);
} void PushUpMin(int rt)
{
Min[rt]=min(Min[rt<<],Min[rt<<|]);
} void PushUpMid(int rt)
{
Mid[rt]=mid(Mid[rt<<],Mid[rt<<|]);
} void Build(int l,int r,int rt)
{
if(l==r){
scanf("%d",&Max[rt]);
Min[rt]=Mid[rt]=Max[rt];
return;
}
int m=(l+r)>>;
Build(lson);
Build(rson);
PushUpMax(rt);
PushUpMin(rt);
PushUpMid(rt);
} void Update(int pos,int val,int l,int r,int rt)
{
if(l==r){
Mid[rt]=Min[rt]=Max[rt]=val;
return;
}
int m=(l+r)>>;
if(pos<=m) Update(pos,val,lson);
else Update(pos,val,rson);
PushUpMax(rt);
PushUpMin(rt);
PushUpMid(rt);
} int QueryMax(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R){
return Max[rt];
}
int m=(l+r)>>;
int res=-maxn-;
if(L<=m) res=max(res,QueryMax(L,R,lson));
if(R>m) res=max(res,QueryMax(L,R,rson));
return res;
} int QueryMin(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R){
return Min[rt];
}
int m=(l+r)>>;
int res=maxn+;
if(L<=m) res=min(res,QueryMin(L,R,lson));
if(R>m) res=min(res,QueryMin(L,R,rson));
return res;
} int QueryMid(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R){
return Mid[rt];
}
int m=(l+r)>>;
int res=maxn;
if(L<=m) res=mid(res,QueryMid(L,R,lson));
if(R>m) res=mid(res,QueryMid(L,R,rson));
return res;
} int main()
{
int T,n,m,k,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
n=<<n;
Build(,n,);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&k,&a,&b);
a++;
if(k==){
b++;
ll t1=(ll)QueryMax(a,b,,n,);
ll t2=(ll)QueryMin(a,b,,n,);
ll t3=(ll)QueryMid(a,b,,n,);
if((t1>=)&&(t2<=))
printf("%lld\n",t1*t2);
else if(t1<||t2>)
printf("%lld\n",t3*t3);
}
else Update(a,b,,n,);
}
}
return ;
}

从[0,n-1]建树

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
typedef long long ll;
const int maxn=(<<)+;
int Max[maxn<<],Min[maxn<<],Mid[maxn<<]; int mid(int a,int b)
{
if(abs(a)<abs(b)) return a;
return b;
} void PushUpMax(int rt)
{
Max[rt]=max(Max[rt<<],Max[rt<<|]);
} void PushUpMin(int rt)
{
Min[rt]=min(Min[rt<<],Min[rt<<|]);
} void PushUpMid(int rt)
{
Mid[rt]=mid(Mid[rt<<],Mid[rt<<|]);
} void Build(int l,int r,int rt)
{
if(l==r){
scanf("%d",&Max[rt]);
Min[rt]=Mid[rt]=Max[rt];
return;
}
int m=(l+r)>>;
Build(lson);
Build(rson);
PushUpMax(rt);
PushUpMin(rt);
PushUpMid(rt);
} void Update(int pos,int val,int l,int r,int rt)
{
if(l==r){
Max[rt]=Min[rt]=Mid[rt]=val;
return;
}
int m=(l+r)>>;
if(pos<=m) Update(pos,val,lson);
else Update(pos,val,rson);
PushUpMax(rt);
PushUpMin(rt);
PushUpMid(rt);
} int QueryMax(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R){
return Max[rt];
}
int m=(l+r)>>;
int res=-maxn;
if(L<=m) res=max(res,QueryMax(L,R,lson));
if(R>m) res=max(res,QueryMax(L,R,rson));
return res;
} int QueryMin(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R){
return Min[rt];
}
int m=(l+r)>>;
int res=maxn;
if(L<=m) res=min(res,QueryMin(L,R,lson));
if(R>m) res=min(res,QueryMin(L,R,rson));
return res;
} int QueryMid(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R){
return Mid[rt];
}
int m=(l+r)>>;
int res=maxn;
if(L<=m) res=mid(res,QueryMid(L,R,lson));
if(R>m) res=mid(res,QueryMid(L,R,rson));
return res;
} int main()
{
int T,n,m,c,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
n=<<n;
Build(,n-,);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&c,&a,&b);
if(c==){
ll t1=QueryMax(a,b,,n-,);
ll t2=QueryMin(a,b,,n-,);
ll t3=QueryMid(a,b,,n-,);
if(t1>=&&t2<=)
printf("%lld\n",t1*t2);
else
printf("%lld\n",t3*t3);
}
else Update(a,b,,n-,);
}
}
return ;
}

hihocoder 1586 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛-题目9 : Minimum【线段树】的更多相关文章

  1. ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 题目9 : Minimum

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You are given a list of integers a0, a1, …, a2^k-1. You need t ...

  2. ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 i题 Minimum(线段树)

    描述 You are given a list of integers a0, a1, …, a2^k-1. You need to support two types of queries: 1. ...

  3. hihoCoder 1586 Minimum 【线段树】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1586 : Minimum 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You are given a list of integers a0, a1, …, a2 ...

  4. hihoCoder #1586 : Minimum-结构体版线段树(单点更新+区间最值求区间两数最小乘积) (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1586 : Minimum Time Limit:1000ms Case Time Limit:1000ms Memory Limit:256MB Description You are give ...

  5. 【线段树】hihocoder 1586 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I. Minimum

    题意:给你一个序列(长度不超过2^17),支持两种操作:单点修改:询问区间中最小的ai*aj是多少(i可以等于j). 只需要线段树维护区间最小值和最大值,如果最小值大于等于0,那答案就是minv*mi ...

  6. hihoCoder 1582 Territorial Dispute 【凸包】(ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1582 : Territorial Dispute 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In 2333, the C++ Empire and the Ja ...

  7. hihoCoder 1584 Bounce 【数学规律】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1584 : Bounce 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 For Argo, it is very interesting watching a cir ...

  8. hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1578 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for ...

  9. 【分类讨论】【计算几何】【凸包】hihocoder 1582 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 E. Territorial Dispute

    题意:平面上n个点,问你是否存在一种黑白染色方案,使得对于该方案,无法使用一条直线使得黑色点划分在直线一侧,白色点划分在另一侧.如果存在,输出一种方案. 如果n<=2,显然不存在. 如果所有点共 ...

随机推荐

  1. 如何在linux中部署mongodb并设置连接认证

    在windows上给mongodb设置连接认证权限:mongodb默认是不认证的,默认没有账号,现在就讲讲怎么设置账户和密码 1.首先进入C:\mongodb\bin下面双击运行mongo.exe启动 ...

  2. js数组操作方法

    数组的操作方法在js中可谓是诸子百家,各种某乱的方法让人眼花缭乱,有时候就会分不清什么是自带的什么是曾今写的api了 数组的增删 1 . push() , pop()  和 shift() unshi ...

  3. mybatis深入理解(四)-----MyBatis的架构设计以及实例分析

    MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例, ...

  4. PuTTy linux下tomcat服务的相关命令

    一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/loca ...

  5. 007-使用python统计代码行数,空行以及注释

    # 自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来 1.打开文件方法 1.1 以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符 f ...

  6. 关于Layui 响应式移动端轮播图的问题

    用layui做轮播图,在手机上宽度异常, 可通过以下方法解决, 不喜欢layui的同学可以选择Swiper // 轮播图 layui.use('carousel', function () { var ...

  7. linux之bc命令

    当在脚本中要处理浮点数计算时,就可以使用bc计算器,先看下面的例子 [root@node2 tmp]# cat bc.sh #!/bin/bash # num1=`echo "scale=3 ...

  8. 第一次接触node.JS

    1.初识node.js node.js平时可以关注: 一.nodejs.org看看nodejs的版本升级,新特性的加入,重要bug的修复等 二.www.npmjs.com模块社区,看他人源代码,省力 ...

  9. 下载额外数据文件失败 以下软件包要求安装后下载附加数据,但其数据无法下载或无法处理 ttf-mscorefonts-installer

    故障显示: 一些软件包的数据文件无法下载 以下软件包要求安装后下载附加数据,但其数据无法下载或无法处理. ttf-mscorefonts-installer 这是一个永久错误,系统中的这些软件包将无法 ...

  10. php封装的smarty类实例是怎样

    * @link http://www.smarty.net/* @copyright 2008 New Digital Group, Inc.* @author Monte Ohrt <mont ...