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. 09安装运行redis-trib.rb所需的环境

    运行redis-trib.rb脚本配置Redis的cluster,需要安装ruby环境,这里采用源码安装: 1:下载源码包: https://cache.ruby-lang.org/pub/ruby/ ...

  2. HDU1709

    /*  * 好奇怪的母函数  */ #include<cstdio> #include<cstring> #include<cmath> #include<a ...

  3. Java问题解读系列之String相关---String、StringBuffer、StringBuilder的区别

    今天的题目是String.StringBuffer和StringBuilder的区别: 首先还是去官方的API看看对这三种类型的介绍吧,Go...... 一.继承类和实现接口情况 1.String类 ...

  4. CesiumLab地形处理成果在Tomcat和IIS上发布

    地形瓦片(散列文件)可以直接放到tomcat或iis下发布,而不用进行额外的开发,从而满足普通用户的需求.下面我们来介绍下如何通过cesiumlab生成的瓦片发布并在前端展示. 1.数据准备: 首先通 ...

  5. nginx 封ip

    封ip段 例如ip为:xx.xx.xx.xx 全封:0.0.0.0/0 封后三段:xx.0.0.0/8 封后两段:xx.xx.0.0/16 封最后一段:xx.xx.xx.0/24

  6. find()和find_all()的具体使用

    在我们学会了BeautifulSoup库的用法后,我们就可以使用这个库对HTML进行解析,从网页中提取我们需要的内容. 在BeautifulSoup 文档里,find().find_all()两者的定 ...

  7. <a>标签操作

    1.点击后onclick事件失效,变灰,不可用 onclick(this); //事件传递this对象 function viewMm(obj) { $(obj).removeAttr("o ...

  8. HDU 1690 最短路

    #include<stdio.h> #include<string.h> #include<queue> #include<algorithm> usi ...

  9. C#中的事件注册和注销

    C#中的事件注册和注销 由于.NET框架对消息循环机制进行了很好的封装,开发人员不再需要深入的了解Windows事件/消息实现的具体机制,也无需创建复杂的事件结构体和所谓的消息句柄.我们所要做的无非就 ...

  10. django1.11启动错误

    错误信息: 复制代码 Unhandled exception in thread started by <function check_errors..wrapper at 0x10f03b8c ...