hdu 1754 I Hate It
最开始学了线段树,然后就写了这道题,误以为所有的线段树都要用lazy标记(其实就是这样的,应该都能用lazy标记吧)
这个题是点修改,所以我感觉用lazy标记没有什么作用,因为他的区间就是最小的了,是一个点区间,然后把lazy标记去了以后就过了(但现在还是好奇带lazy标记的应该怎么写)
#include <bits/stdc++.h> using namespace std; const int maxn=2e5+7; int num[maxn]; struct node { int l,r; int maxe; }tree[maxn*4]; void build(int i,int l,int r) { tree[i].l=l; tree[i].r=r; if(l==r){ tree[i].maxe=num[l]; // printf("test %d %d\n",l,tree[i].maxe); return ; } int mid=(l+r)>>1; build(i<<1,l,mid); build(i<<1|1,mid+1,r); tree[i].maxe=max(tree[i<<1].maxe,tree[i<<1|1].maxe); } void update(int i,int l,int r,int val) { if(tree[i].l==l&&tree[i].r==r){ tree[i].maxe=val; return ; } tree[i].maxe=max(tree[i].maxe,val); int mid=(tree[i].l+tree[i].r)>>1; if(r<=mid) update(i<<1,l,r,val); else if(l>mid) update(i<<1|1,l,r,val); else{ update(i<<1,l,mid,val); update(i<<1|1,mid+1,r,val); } } int query(int i,int l,int r) { if(tree[i].l==l&&tree[i].r==r){ return tree[i].maxe; } int mid=(tree[i].l+tree[i].r)>>1; if(r<=mid) query(i<<1,l,r); else if(l>mid) query(i<<1|1,l,r); else return max(query(i<<1,l,mid),query(i<<1|1,mid+1,r)); } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { memset(num,0,sizeof(num)); for(int i=1;i<=n;i++) scanf("%d",&num[i]); build(1,1,n); for(int i=0;i<m;i++){ char ch; cin>>ch; if(ch=='Q'){ int a,b; scanf("%d%d",&a,&b); printf("%d\n",query(1,a,b)); } else{ int a,b; scanf("%d%d",&a,&b); update(1,a,a,b); } } } return 0; } /* 5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5 5 6 1 2 3 4 5 Q 1 5 Q 3 4 Q 4 5 Q 1 5 */