題目:
1101 2 3 4 5 6 7 8 9 10Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End Sample OutputCase 1:63359代碼:
①線段樹
#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<ctype.h> //tower()#include<set> #include<map> #include<iomanip>// cout<<setprecision(1)<<fixed<<a;#include<vector> #include<time.h> #include<assert.h> //assert#include<cmath> #include<algorithm>#include<bitset>#include<limits.h>#include<stack>#include<queue>using namespace std;const int maxn=50010;const int inf=0x7fffffff;/*線段樹單點更新*/#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1int n,t,stree[maxn<<2];//根節(jié)點維護區(qū)間和 char s[7];void build(int l,int r,int rt){//葉節(jié)點從l到r,樹根為rt if(l==r){ scanf("%d",&stree[rt]); return; } int mid=(l+r)>>1; build(lson); build(rson); stree[rt]=stree[rt<<1]+stree[rt<<1|1]; }void update(int x,int v,int l,int r,int rt){//線段樹(樹根為rt,對應(yīng)區(qū)間為[l,r])中x結(jié)點加v if(l==r){ stree[rt]+=v; return; } int mid=(l+r)>>1; if(x<=mid) update(x,v,lson); if(x>mid) update(x,v,rson); stree[rt]=stree[rt<<1]+stree[rt<<1|1];}int query(int a,int b,int l,int r,int rt){//查詢線段樹(樹根為rt,對應(yīng)區(qū)間為[l,r])中子區(qū)間[a,b]區(qū)間和 if(a<=l&&b>=r) return stree[rt]; int ans=0; int mid=(l+r)>>1; if(a<=mid) ans+=query(a,b,lson); if(b>mid) ans+=query(a,b,rson); return ans;}int main(){//327MS 2356K scanf("%d",&t); for(int cas=1;cas<=t;++cas){ printf("Case %d:/n",cas); scanf("%d",&n); memset(stree,0,sizeof(stree)); build(1,n,1); int p,q; while(~scanf("%s",s)){ if(s[0]=='Q') scanf("%d%d",&p,&q),printf("%d/n",query(p,q,1,n,1)); else if(s[0]=='A') scanf("%d%d",&p,&q),update(p,q,1,n,1); else if(s[0]=='S') scanf("%d%d",&p,&q),update(p,-q,1,n,1); else if(s[0]=='E') break; } } return 0;}②樹狀數(shù)組
#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<ctype.h> //tower()#include<set> #include<map> #include<iomanip>// cout<<setprecision(1)<<fixed<<a;#include<vector> #include<time.h> #include<assert.h> //assert#include<cmath> #include<algorithm>#include<bitset>#include<limits.h>#include<stack>#include<queue>using namespace std;const int maxn=50010;const int inf=0x7fffffff;int n,t,c[maxn];char s[7];int sum(int i){ int s=0; while(i>0){ s+=c[i]; i-=i&(-i); } return s;}void add(int i,int x){ while(i<=n){//n not maxn c[i]+=x; i+=i&(-i); }}int main(){//312MS 1768K int a,p,q; scanf("%d",&t); for(int cas=1;cas<=t;++cas){ memset(c,0,sizeof(c)); printf("Case %d:/n",cas); scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a); add(i,a); } while(~scanf("%s",s)){ if(s[0]=='Q') scanf("%d%d",&p,&q),printf("%d/n",sum(q)-sum(p-1)); else if(s[0]=='A') scanf("%d%d",&p,&q),add(p,q); else if(s[0]=='S') scanf("%d%d",&p,&q),add(p,-q); else if(s[0]=='E') break; } } return 0;}
新聞熱點
疑難解答