JZOJ 1959 最大值
2018-03-02 23:56
169 查看
线段树
不想配图1 2 3 4 5
1-4 4
3 5
1 2 5 4 5
2-4 5
所以这个线段树是一种高级的算法!(nlogn)
1-5
1-3 4-5
1-2 3 4 5
1 2 3 4 5
树状数组不能用最大值!
代码
#pragma GCC optimize(2) #include <cstdio> #include <cctype> #include <climits> #include <algorithm> using namespace std; struct node{int w;}tree[400001]; int a[100001],n,m,ans; inline int in(){ int ans=0,f=1; char c=getchar(); while (!isdigit(c)&&c!='-') c=getchar(); if (c=='-') c=getchar(),f=-f; while (isdigit(c)) ans=ans*10+c-48,c=getchar(); return ans*f; } int build(int l,int r,int k){ if (l==r) return tree[k].w=a[r]; return tree[k].w=max(build(l,(l+r)>>1,k<<1),build(((l+r)>>1)+1,r,(k<<1)+1)); } inline void in1(int &x,int &y){x=in(); y=in();} void update(int l,int r,int x,int y,int k){ if (x==l&&x==r) {tree[k].w=y; return;} int mid=(l+r)>>1; if (x<=mid) update(l,mid,x,y,k<<1); else update(mid+1,r,x,y,(k<<1)+1); tree[k].w=max(tree[k<<1].w,tree[(k<<1)+1].w); } void find(int l,int r,int x,int y,int k){ if (x==l&&y==r) {ans=max(ans,tree[k].w); return;} int mid=(l+r)>>1; if (y<=mid) find(l,mid,x,y,k<<1);//左边 else if (x>mid) find(mid+1,r,x,y,(k<<1)+1);//右边 else find(l,mid,x,mid,k<<1),find(mid+1,r,mid+1,y,(k<<1)+1);//一起搜 } int main(){ n=in(); for (int i=1;i<=n;i++) a[i]=in(); build(1,n,1); m=in(); while (m--){ int q=in(),x,y; ans=INT_MIN; in1(x,y); if (q==1) update(1,n,x,y,1); else find(1,n,x,y,1),printf("%d\n",ans); } return 0; }
相关文章推荐
- 最大配对 jzoj 1280
- 【JZOJ2224】【NOI2006】最大获利
- jzoj4887 最大匹配
- JZOJ4887. 【NOIP2016提高A组集训第13场11.11】最大匹配
- zzulioj-1959-数组最大值【思维】
- 【JZOJ 4887】最大匹配
- [jzoj]3457. 【NOIP2013模拟联考3】沙耶的玩偶(doll)(匈牙利-二分图最大匹配)
- jzoj3614 [NOI2014模拟] 加工安排 最大流
- jzoj 2548. 【NOIP2011模拟9.4】最大正方形
- JZOJ4828. 【GDOI2017模拟10.30】最大值 分类讨论+分治处理子集问题
- [二分][dfs]JZOJ 2748 最大立方体空间 80%做法
- 【jzoj4887】【最大匹配】【树形动态规划】
- JZOJ8.13最大正方形
- [JZOJ 1280]最大匹配
- 最大流 - JZOJ 4087 网络吞吐量 CQOI 2015
- jzoj 1154_购物_最大流/树形dp
- min_25 JZOJ5594 最大真因数
- JZOJ__DAY 4:【普及模拟】最大值
- JZOJ 1960 最大值2