ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 题目9 : Minimum(线段树)
来源:互联网 发布:蓝牙打印机测试软件 编辑:程序博客网 时间:2024/06/05 10:29
- 样例输入
131 1 2 2 1 1 2 251 0 71 1 22 1 22 2 21 1 2
- 样例输出
114
描述
You are given a list of integers a0, a1, …, a2^k-1.
You need to support two types of queries:
1. Output Minx,y∈[l,r] {ax∙ay}.
2. Let ax=y.
输入
The first line is an integer T, indicating the number of test cases. (1≤T≤10).
For each test case:
The first line contains an integer k (0 ≤ k ≤ 17).
The following line contains 2k integers, a0, a1, …, a2^k-1 (-2k ≤ ai < 2k).
The next line contains a integer (1 ≤ Q < 2k), indicating the number of queries. Then next Q lines, each line is one of:
1. 1 l r: Output Minx,y∈[l,r]{ax∙ay}. (0 ≤ l ≤ r < 2k)
2. 2 x y: Let ax=y. (0 ≤ x < 2k, -2k ≤ y < 2k)
输出
For each query 1, output a line contains an integer, indicating the answer.
恰巧学到线段树,于是就用上了。我没看这个题目,队友A的。
题目有两种操作:1求区间内最小两个数的乘积,(注意一个点也是乘积),2将x得值换为y
如果区间内有正有负那么最小积就是最小与最大的乘积,如果区间内都正或者都负了,那么结果就是绝对值最小的数的平方,题目维护三个线段树,分别求的是区间最小,最大,和绝对值最小。注意下标从0开始
代码:
#include<iostream>#include<string>#include<cstdio>#include<algorithm>#include<cmath>#include<iomanip>#include<queue>#include<cstring>#include<map>#include<vector>using namespace std;typedef long long ll;#define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1const int maxn =131100;int MAX[maxn<<2],MIN[maxn<<2],MID[maxn<<2];int go(int a,int b) { if(abs(a)<abs(b)) return a; else return b;}void PushUPmax(int rt) {MAX[rt] = max(MAX[rt<<1] , MAX[rt<<1|1]);}void PushUPmin(int rt) {MIN[rt] = min(MIN[rt<<1] , MIN[rt<<1|1]);}void PushUPmid(int rt) {MID[rt] = go(MID[rt<<1] , MID[rt<<1|1]);}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) >> 1;build(lson);build(rson);PushUPmax(rt);PushUPmin(rt);PushUPmid(rt);}void update(int p,int sc,int l,int r,int rt) {if (l == r) {MIN[rt]=MID[rt]=MAX[rt] = sc;return ;}int m = (l + r) >> 1;if (p <= m) update(p , sc , lson);else update(p , sc , rson);PushUPmax(rt);PushUPmin(rt);PushUPmid(rt);}int querymin(int L,int R,int l,int r,int rt) {if (L <= l && r <= R) {return MIN[rt];}int m = (l + r) >> 1;int ret = maxn;if (L <= m) ret = min(ret , querymin(L , R , lson));if (R > m) ret = min(ret , querymin(L , R , rson));return ret;}int querymax(int L,int R,int l,int r,int rt) {if (L <= l && r <= R) {return MAX[rt];}int m = (l + r) >> 1;int ret = -maxn;if (L <= m) ret = max(ret , querymax(L , R , lson));if (R > m) ret = max(ret , querymax(L , R , rson));return ret;}int querymid(int L,int R,int l,int r,int rt) {if (L <= l && r <= R) {return MID[rt];}int m = (l + r) >> 1;int ret = maxn;if (L <= m) ret = go(ret , querymid(L , R , lson));if (R > m) ret = go(ret , querymid(L , R , rson));return ret;}int main() {int T,n,m; scanf("%d",&T); while(T--) { scanf("%d",&n); n=pow(2,n);build(1 , n , 1); scanf("%d",&m);while (m --) {int a , b , c;scanf("%d%d%d",&c,&a,&b); a++;if (c == 1){ b++; ll t1=(ll)querymin(a , b , 1 , n , 1); ll t2=(ll)querymax(a , b , 1 , n , 1); ll t3=(ll)querymid(a , b , 1 , n , 1); ll ans; //cout<<t1<<" "<<t2<<endl; if(t1<=0&&t2>=0) { ans=t1*t2; printf("%lld\n",ans); } else if(t1>0||t2<0) { ans=t3*t3; printf("%lld\n",ans); }}else update(a , b , 1 , n , 1);}}return 0;}
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛-题目9 : Minimum-(线段树)
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 题目9 : Minimum(线段树)
- hihoCoder 1586 Minimum 【线段树】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I.Minimum(线段树区间极值+分类讨论)
- HihoCoder-1586 Minimum(线段树,区间最值,ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
- Minimum (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 题9)
- 线段树 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 HihoCoder 1586
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 Minimum
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 Minimum
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 Minimum
- hihocoder 1586 : Minimum ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛-题目1 : Visiting Peking University
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 题目1 : Visiting Peking University
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛——Minimum(I题)
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I.Minimum(线段树_单点修改,查询区间最大最少值)
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 G Bounce (规律)
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 Territorial Dispute (凸包)
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛-A-Visiting Peking University
- 水题
- MySQL死锁问题分析及解决方法实例详解
- 漫漫长路的开始
- 浅谈大型web系统架构
- mongo 脚本整理
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 题目9 : Minimum(线段树)
- Spring MVC 浅析
- leetcode--PascalTriangle
- 统计学简介之十一——假设检验定义
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛-题目1 : Visiting Peking University
- HTTP状态码
- Java中的多线程你只要看这一篇就够了
- cookie的使用
- Problem 63 Powerful digit counts