hihoCoder1586 Minimum 线段树
2017-09-26 10:42
330 查看
题目:
http://hihocoder.com/problemset/problem/1586?sid=1197111题意:
给定一个序列,有两种操作:1 l r:从区间[l,r]内选出数字ai, aj,是的ai∗aj的值最小
2 x y:把第x个元素的值更新为y
思路:
求区间内乘积的最小值,无非以下情况:都是正数时,直接取最小值相乘即可,有正数有负数的时候,取最小值和最大值相乘,都是负数时,取最大值相乘。维护最大值最小值用线段树即可#include <bits/stdc++.h> using namespace std; const int N = 1000000 + 10, INF = 0x3f3f3f3f; struct node { int l, r, maxx, minn; }tr[N*4]; int a ; void push_up(int k) { tr[k].maxx = max(tr[k<<1].maxx, tr[k<<1|1].maxx); tr[k].minn = min(tr[k<<1].minn, tr[k<<1|1].minn); } void build(int l, int r, int k) { tr[k].l = l, tr[k].r = r; if(l == r) { tr[k].maxx = tr[k].minn = a[l]; return; } int mid = (l + r) >> 1; build(l, mid, k<<1); build(mid+1, r, k<<1|1); push_up(k); } void update(int x, int val, int k) { if(tr[k].l == tr[k].r && x == tr[k].l) { tr[k].maxx = tr[k].minn = val; return; } int mid = (tr[k].l + tr[k].r) >> 1; if(x <= mid) update(x, val, k<<1); else update(x, val, k<<1|1); push_up(k); } int query(int l, int r, int f, int k) { if(l <= tr[k].l && tr[k].r <= r) { return f ? tr[k].maxx : tr[k].minn; } int mid = (tr[k].l + tr[k].r) >> 1; int ans = f ? -INF : INF; if(l <= mid) { int t = query(l, r, f, k<<1); ans = f ? max(ans, t) : min(ans, t); } if(r > mid) { int t = query(l, r, f, k<<1|1); ans = f ? max(ans, t) : min(ans, t); } return ans; } int main() { int t, n, m; scanf("%d", &t); while(t--) { scanf("%d", &n); n = 1 << n; for(int i = 1; i <= n; i++) scanf("%d", &a[i]); build(1, n, 1); scanf("%d", &m); int opt, x, y; for(int i = 1; i <= m; i++) { scanf("%d%d%d", &opt, &x, &y); if(opt == 1) { ++x, ++y; int maxx = query(x, y, 1, 1), minn = query(x, y, 0, 1); printf("%lld\n", min(1LL*minn*minn, min(1LL*minn*maxx, 1LL*maxx*maxx))); } else { ++x; update(x, y, 1); } } } return 0; }
相关文章推荐
- hihocoder1586 Minimum 2017icpc北京赛区 线段树区间最值
- hihocoder-1586---Minimum(2017-icpc-网络赛-北京赛区)(线段树)
- 【线段树】hihocoder 1586 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I. Minimum
- hihoCoder - 1586 Minimum 线段树模板
- hihoCoder 1586 Minimum 【线段树】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
- hihoCoder 1586 Minimum 【线段树】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
- HihoCoder-1586 Minimum(线段树,区间最值,ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
- hihocoder #1586 : Minimum(线段树)
- hihocoder1586-2017acm北京网络赛9&线段树&思维&板子- Minimum
- 线段树 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 HihoCoder 1586
- #1586 : Minimum(线段树)
- hihoCoder - 1586 Minimum (2017 ACM-ICPC 亚洲区 (北京赛区) 网络赛 I)
- hihoCoder 1116 计算(线段树)
- HDU 1394 Minimum Inversion Number.(线段树)
- HihoCoder - 1080 更为复杂的买卖房屋姿势 (线段树)
- hdu Minimum Inversion Number(线段树求逆序数有关问题的一个小归纳)
- Minimum Inversion Number(线段树)
- hdu1394--Minimum Inversion Number(线段树求逆序数,纯为练习)
- hdu 1394 Minimum Inversion Number 用线段树求0到n-1的排列的逆序数
- HDU 1394 Minimum Inversion Number【线段树求逆序数】