hihoCoder - 1586 Minimum 线段树模板
2017-09-23 13:57
555 查看
题目链接
思路:操作1:单点更新 操作2。找到区间 的最值无非三种情况。
坑点:下标重0开始的
思路:操作1:单点更新 操作2。找到区间 的最值无非三种情况。
坑点:下标重0开始的
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cctype> #include <sstream> #include <cmath> using namespace std; const int inf =0x3f3f3f3f; typedef long long LL; const int MAXN = 200005; struct Tree { int Max, Min; int l, r ; } tree[MAXN*4]; int a[MAXN]; int n; void pushup(int k) { tree[k].Max =max(tree[k<<1].Max,tree[k<<1|1].Max); tree[k].Min =min(tree[k<<1].Min,tree[k<<1|1].Min); } void build(int k, int l, int r)//建树的模板操作,通过递归和二分 { tree[k].l = l; tree[k].r = r; if(l==r) { tree[k].Max=tree[k].Min=a[l]; return ; } int mid; mid = (tree[k].l+tree[k].r)>>1; build(k<<1, l, mid); build(k<<1|1,mid+1,r); pushup(k); return ; } void update(int k, int pos, int c) { if(pos == tree[k].l && tree[k].r == pos) { tree[k].Max=tree[k].Min=c; return ; } int mid=(tree[k].l+tree[k].r)>>1; if(pos<=mid) update(k<<1, pos, c); else update(k<<1|1, pos,c); pushup(k); } LL Search1(int l, int r, int k)//query { int mid; LL Max=-inf; if(tree[k].l>=l&&tree[k].r<=r) return Max = tree[k].Max; mid = (tree[k].l+tree[k].r)>>1; if(l<=mid) Max=max(Max, Search1(l, r, k<<1)); if(r>mid) Max=max(Max,Search1(l, r, k<<1|1)); return Max; } LL Search2(int l, int r, int k)//query { int mid; LL Min=inf; if(tree[k].l>=l&&tree[k].r<=r) return tree[k].Min; mid = (tree[k].l+tree[k].r)>>1; if(l<=mid) Min = min(Min, Search2(l, r, k<<1)); if(r>mid) Min = min(Min, Search2(l, r, k<<1|1)); return Min; } int main() { int t, k; scanf("%d", &t); while(t--) { scanf("%d", &k); n=1<<k; for(int i=1;i<=n;++i) scanf("%d", &a[i]); build(1, 1, n); //for(int i=1;i<=15;++i) //printf("%d %lld %lld %lld %lld\n", i, tree[i].l, tree[i].r, tree[i].Max, tree[i].Min); int q; scanf("%d",&q); while(q--) { int op ; int x, y; scanf("%d %d %d", &op, &x, &y); x++; if(op==2) update(1, x, y); else { LL Max, Min; y++; Max=Search1(x, y, 1); Min=Search2(x, y, 1); LL ans; ans=min(Max*Max, Min*Min); ans=min(Min*Max, ans); //printf("%lld %lld\n", Max, Min); printf("%lld\n", ans); } } } return 0; }
相关文章推荐
- 【线段树】hihocoder 1586 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I. Minimum
- hihocoder1586 Minimum 2017icpc北京赛区 线段树区间最值
- hihoCoder1586 Minimum 线段树
- hihoCoder 1586 Minimum 【线段树】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
- hihoCoder 1586 Minimum 【线段树】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
- hihocoder-1586---Minimum(2017-icpc-网络赛-北京赛区)(线段树)
- HihoCoder-1586 Minimum(线段树,区间最值,ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
- hihocoder 1078 线段树的区间修改 (线段树 区间更新 模板)
- hihoCoder - 1586 Minimum (2017 ACM-ICPC 亚洲区 (北京赛区) 网络赛 I)
- hihocoder1586-2017acm北京网络赛9&线段树&思维&板子- Minimum
- 线段树 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 HihoCoder 1586
- hdu 1394 Minimum Inversion Number(线段树)【归并排序模板】
- #1586 : Minimum(线段树)
- hdu-1394 Minimum Inversion Number(线段树求逆序数模板)
- hihocoder #1586 : Minimum(线段树)
- hdu 1394 Minimum Inversion Number 用线段树求0到n-1的排列的逆序数
- HDU 1698 线段树成段更新模板
- 线段树模板
- 线段树入门(个人习惯模板)--士兵杀敌
- -----线段树模板