题目:
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];//根节点维护区间和 char s[7];void build(int l,int r,int rt){//叶节点从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,对应区间为[l,r])中x结点加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,对应区间为[l,r])中子区间[a,b]区间和 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;}②树状数组
#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;}
新闻热点
疑难解答