1.HDU 1754 (点修改)
#include <map> #include <set> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <iomanip> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define ll long long #define mod 1000000007 #define mem(a) memset(a,0,sizeof(a)) using namespace std; const int maxn = 200000 + 5 , inf = 0x3f3f3f3f ; int sum[maxn*4],A[maxn]; void PushUp(int rt){sum[rt] = max(sum[rt*2],sum[rt*2+1]);} void Build(int l,int r,int rt){ if(l==r){ sum[rt]=A[l]; return; } int m = (l+r)/2; Build(l,m,rt*2); Build(m+1,r,rt*2+1); PushUp(rt); } void Updata(int L,int c,int l,int r,int rt){ if(r==l){ sum[rt] = c; return; } int m = (l+r)/2; if(L<=m) Updata(L,c,l,m,rt*2); else Updata(L,c,m+1,r,rt*2+1); PushUp(rt); } int Query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R){ return sum[rt]; } int m = (l+r)/2; int ans = 0; if(L<=m) ans = max(ans,Query(L,R,l,m,rt*2)); if(R>m ) ans = max(ans,Query(L,R,m+1,r,rt*2+1)); return ans; } int main(){ char c; int n,m,a,b; while(scanf("%d %d",&n,&m)!=EOF){ mem(sum);mem(A); for(int i=1;i<=n;i++)scanf("%d",&A[i]); Build(1,n,1); while(m--){ scanf(" %c",&c); if(c=='Q'){ scanf("%d %d",&a,&b); printf("%d\n",Query(a,b,1,n,1)); }else{ scanf("%d %d",&a,&b); Updata(a,b,1,n,1); } } } return 0; }
2.POJ 3468 (区间修改)
#include <map> #include <set> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <iomanip> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define ll long long #define mod 1000000007 #define mem(a) memset(a,0,sizeof(a)) using namespace std; const int maxn = 100000 + 7 , inf = 0x3f3f3f3f ; ll sum[maxn<<2],add[maxn<<2]; ll A[maxn]; int n,sum_cmd; void Pushup(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];} void Build(int l,int r,int rt){ if(l==r){ sum[rt] = A[l]; return; } int m = (l+r)>>1; Build(l,m,rt<<1); Build(m+1,r,rt<<1|1); Pushup(rt); } void PushDown(int rt,int ln,int rn){ if(add[rt]){ add[rt<<1]+=add[rt]; add[rt<<1|1]+=add[rt]; sum[rt<<1]+=add[rt]*ln; sum[rt<<1|1]+=add[rt]*rn; add[rt] = 0; } } void Updata(int L,int R,int C,int l,int r,int rt){ if(L<=l&&r<=R){ sum[rt]+=C*(r-l+1); add[rt]+=C; return; } int m = (r+l)>>1; PushDown(rt,m-l+1,r-m); if(L<=m) Updata(L,R,C,l,m,rt<<1); if(R> m) Updata(L,R,C,m+1,r,rt<<1|1); Pushup(rt); } ll Query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R){ return sum[rt]; } int m = (l+r)>>1; PushDown(rt,m-l+1,r-m); ll ans = 0; if(L<=m) ans+=Query(L,R,l,m,rt<<1); if(R >m) ans+=Query(L,R,m+1,r,rt<<1|1); return ans; } int main(){ char cmd; ll a,b,c; while(~scanf("%d %d",&n,&sum_cmd)){ mem(A);mem(sum);mem(add); for(int i = 1 ; i <= n ; i ++ )scanf("%lld",&A[i]); Build(1,n,1); while(sum_cmd--){ scanf(" %c",&cmd); if(cmd=='Q'){ scanf("%lld %lld",&a,&b); printf("%lld\n",Query(a,b,1,n,1)); }else if(cmd=='C'){ scanf("%lld %lld %lld",&a,&b,&c); Updata(a,b,c,1,n,1); } } } return 0; }
3.HDU 1754(区间求最大值)
#include <map> #include <set> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <iomanip> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define ll long long #define mod 1000000007 #define mem(a) memset(a,0,sizeof(a)) using namespace std; const int maxn = 200000 + 5 , inf = 0x3f3f3f3f ; int sum[maxn*4],A[maxn]; void PushUp(int rt){sum[rt] = max(sum[rt*2],sum[rt*2+1]);} void Build(int l,int r,int rt){ if(l==r){ sum[rt]=A[l]; return; } int m = (l+r)/2; Build(l,m,rt*2); Build(m+1,r,rt*2+1); PushUp(rt); } void Updata(int L,int c,int l,int r,int rt){ if(r==l){ sum[rt] = c; return; } int m = (l+r)/2; if(L<=m) Updata(L,c,l,m,rt*2); else Updata(L,c,m+1,r,rt*2+1); PushUp(rt); } int Query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R){ return sum[rt]; } int m = (l+r)/2; int ans = 0; if(L<=m) ans = max(ans,Query(L,R,l,m,rt*2)); if(R>m ) ans = max(ans,Query(L,R,m+1,r,rt*2+1)); return ans; } int main(){ char c; int n,m,a,b; while(scanf("%d %d",&n,&m)!=EOF){ mem(sum);mem(A); for(int i=1;i<=n;i++)scanf("%d",&A[i]); Build(1,n,1); while(m--){ scanf(" %c",&c); if(c=='Q'){ scanf("%d %d",&a,&b); printf("%d\n",Query(a,b,1,n,1)); }else{ scanf("%d %d",&a,&b); Updata(a,b,1,n,1); } } } return 0; }