HDU 1754 单点更新,区间查询最大值,水题……
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define INF 1000000 #define maxn 1000010 using namespace std; typedef long long ll; typedef unsigned long long ull; int Max[maxn],a[200005],n,m,i; void pushup(int i) { Max[i]=max(Max[i<<1],Max[i<<1|1]); } void build(int i,int l,int r) { if(l==r) { Max[i]=a[l]; return ; } int mid=(l+r)>>1; build(lson);build(rson); pushup(i); } void update(int i,int l,int r,int x,int v) { if(l==r&&l==x) { Max[i]=v; return ; } int mid=(l+r)>>1; if(x<=mid) update(lson,x,v); else update(rson,x,v); pushup(i); } int query(int i,int l,int r,int L,int R) { if(L<=l&&r<=R) return Max[i]; int mid=(l+r)>>1,ans=0; if(L<=mid) ans=max(ans,query(lson,L,R)); if(R>mid) ans=max(ans,query(rson,L,R)); return ans; } int main() { while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) scanf("%d",a+i); build(1,1,n); int x,y; char str[3]; while(m--) { scanf("%s%d%d",str,&x,&y); if(str[0]=='Q') printf("%d\n",query(1,1,n,x,y)); else update(1,1,n,x,y); } } return 0; }
HDU 1698 区间更新,区间查询,lazy标记种类,水……
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define INF 1000000 #define maxn 400010 using namespace std; typedef long long ll; typedef unsigned long long ull; int sum[maxn],lazy[maxn],n,q; void pushup(int i) { sum[i]=sum[i<<1]+sum[i<<1|1]; } void pushdown(int i,int l,int r) { if(lazy[i]) { int mid=(l+r)>>1; lazy[i<<1]=lazy[i<<1|1]=lazy[i]; sum[i<<1]=(mid-l+1)*lazy[i<<1]; sum[i<<1|1]=(r-mid)*lazy[i<<1|1]; lazy[i]=0; } } void update(int i,int l,int r,int L,int R,int v) { if(l==L&&r==R) { sum[i]=(r-l+1)*v; lazy[i]=v; return ; } int mid=(l+r)>>1; pushdown(i,l,r); if(R<=mid) update(lson,L,R,v); else if(L>mid) update(rson,L,R,v); else { update(lson,L,mid,v); update(rson,mid+1,R,v); } pushup(i); } void build(int i,int l,int r) { if(l==r) { sum[i]=1; lazy[i]=1; return ; } sum[i]=lazy[i]=0; int mid=(l+r)>>1; build(lson);build(rson); pushup(i); } int main() { int t; cin>>t; for(int i=1;i<=t;i++) { scanf("%d%d",&n,&q); build(1,1,n); int l,r,v; while(q--) { scanf("%d%d%d",&l,&r,&v); update(1,1,n,l,r,v); } printf("Case %d: The total value of the hook is %d.\n",i,sum[1]); } return 0; }
怒刷30道线段树、树状数组
时间: 2024-10-06 06:07:47