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. jquery判断元素是否出现在可视区

      在我们的日常开发中,经常会遇到当元素出现在可视区的时候需要去出发某一事件的情况.我最近在优化环球网首页的时候,将非可视区的代码全部放入到webComponent中.打算当这个元素出现在可视区的时候 ...

  2. Composer项目安装依赖包

    说明:一般用Composer的项目中,目录下都有一个composer.json文件,安装这些依赖,只需要输入命令即可 步骤: cmd进入项目目录,运行命令即可 composer install 文章参 ...

  3. zabbix自定义监控redis

    zabbix监控redis脚本 #!/bin/bash #此脚本用来获取redis-cli info信息 redis_cli="/usr/local/redis/bin/redis-cli& ...

  4. python基础--类的基础使用

    什么是面向对象: 面向对象是一种编程思想,其中的核心是对象,程序是一系列对象的集合,程序员负责调度控制这些对象来交互着完成某些任务. 在面向对象中程序员的角度发生改变,从具体的操作者变成了指挥者 面向 ...

  5. 计蒜客 Prefix Free Code(字典树+树状数组)

    Consider n initial strings of lower case letters, where no initial string is a prefix of any other i ...

  6. TYVJ4239 [NOIP2015提高组DayT3]斗地主

    P2668 斗地主 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中, 牌的大小关系根据牌的数码表示如 ...

  7. PHP配置环境中如何开启伪静态

    1.在httpd.conf中引入httpd-vhosts.conf 2.在httpd.conf中开启mod_rewrite.so 3.在httpd-vhosts.conf中配置虚拟主机 AllowOv ...

  8. 清除SQL数据库文本字段中的回车、换行符的方法

    清除SQL数据库中文本字段的回车.换行符的方法 清除回车符: update tableName set columnName = rtrim(ltrim(replace(columnName ,cha ...

  9. 初次接触python的re模块

    刷CF的时候,看到一个简单的题目,可以用来练练正则表达式 于是乎找到了re.sub的用法,说明如下 re.sub: (pattern, repl, string, count=0, │       f ...

  10. java贪吃蛇小游戏详解

    https://blog.csdn.net/u011622021/article/details/81162083