hdu 1754 线段树
2014-06-30 23:34
134 查看
#include<iostream> #include<cstdio> #define MAX 200005 using namespace std; int tree[MAX*4]; void build(int s,int e,int n) { if(e==s) { scanf("%d",&tree ); return ; } int mid=(s+e)/2; build(s,mid,2*n); build(mid+1,e,2*n+1); tree =max(tree[2*n],tree[2*n+1]); } int query(int s,int e,int a,int b,int n) { if(s==a&&e==b) return tree ; int mid=(s+e)/2; if(b<=mid) return query(s,mid,a,b,2*n); else if(mid<a) return query(mid+1,e,a,b,2*n+1); else return max(query(s,mid,a,mid,2*n),query(mid+1,e,mid+1,b,2*n+1) ); } void modify(int s,int e,int a,int b,int n) { if(s==e) { tree =b ; return ; } int mid=(s+e)/2; if(a<=mid) modify(s,mid,a,b,2*n); else modify(mid+1,e,a,b,2*n+1) ; tree =max(tree[2*n],tree[2*n+1]) ; // max } /* void show(int s,int e,int n) { cout<<"tree["<<n<<"]=["<<s<<","<<e<<']'<<endl; if(s==e) return ; int mid=(s+e)/2; show(s,mid,2*n); show(mid+1,e,2*n+1); } */ int main() { int n,m,i,a,b; char c[4]; while(scanf("%d%d",&n,&m)!=EOF) { build(1,n,1); while(m--) { getchar(); scanf("%s%d%d",c,&a,&b); if(c[0]=='Q') printf("%d\n",query(1,n,a,b,1) ); else modify(1,n,a,b,1); } } return 0; }
<pre name="code" class="cpp">#include<iostream> // ac#include<cstdio>#include<cstring>using namespace std;struct line{int le,ri,n;}a[1000000]; // kai 100 0000int b[200005];int insert(int s,int e,int m) // insert 返回最大值 ==query{if(a[m].le==s&&e==a[m].ri)return a[m].n ;int mid=(a[m].le+a[m].ri)/2;if(e<=mid&&s<=mid) return insert(s,e,2*m);else if(mid<s) return insert(s,e,2*m+1);elsereturn max( insert(s,mid,2*m) , insert(mid+1,e,2*m+1) );}void modify(int s,int e,int m){if(a[m].le==a[m].ri){a[m].n=e;return ;}int mid=(a[m].le+a[m].ri)/2;if(s<=mid) modify(s,e,2*m);else modify(s,e,2*m+1);a[m].n=max( insert(a[m].le,mid,2*m) , insert(mid+1,a[m].ri,2*m+1) ) ;}void build(int s,int e,int m ){a[m].le=s;a[m].ri=e;int mid=(s+e)/2;if(s==e){a[m].n=b[mid];return ;}build(s,mid,2*m);build(mid+1,e,2*m+1);a[m].n=max( a[2*m].n , a[2*m+1].n );}int main(){int n,m,i,A,B;char C;while(scanf("%d%d",&n,&m)!=EOF){for(i=1;i<=n;i++)scanf("%d",&b[i]);build(1,n,1);while(m--){getchar();scanf("%c%d%d",&C,&A,&B);// cin>>C>>A>>B;if(C=='Q')printf("%d\n",insert(A,B,1));elsemodify(A,B,1);}}return 0;}
相关文章推荐
- 线段树(单点更新) 之 hdu 1754
- hdu1754 I Hate It 线段树运用求最大值
- HDU 1754 I hate it(线段树。单点更新, 区间查询)
- hdu_1754,线段树单点更新,求区间最值
- HDU 1754 线段树裸题
- hdu 1754 线段树
- HDU-1754 I Hate It 线段树
- 线段树_HDU_1754
- hdu 1754 I Hate It(线段树 点更新 最大值)
- HDU 1754 I Hate It(线段树)
- HDU 1754 I Hate It(基础线段树~)
- hdu 1754 I Hate It 线段树
- HDU 1754 I Hate It 线段树
- HDU - 1754 I Hate It(线段树)
- hdu 1754 线段树区间最值
- HDU-1754--I Hate It---线段树
- hdu1754 简单的线段树单点更新
- HDU 1754 I Hate It (线段树 & 树状数组)
- hdu 1754 线段树之二
- HDU1754--线段树