分块 HDU 1166
用分块也可以写
就分成根号n块
#include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<set> #include<string> #include<map> using namespace std; typedef long long LL; #define inf 2000000000 #define MAXN 200010 int num[MAXN]; int en[MAXN]; int main() { int t,ca; scanf("%d",&t); ca=1; while(t--) { int n; scanf("%d",&n); int sz=(int)sqrt(1.0*n); memset(en,0,sizeof(en)); for(int i=1;i<=n;i++) { scanf("%d",&num[i]); int x=i/sz; en[x]+=num[i]; } printf("Case %d:\n",ca++); while(1) { char s[10]; scanf("%s",s); if(s[0]=='E') break; int a,b; scanf("%d%d",&a,&b); if(s[0]=='Q') { int ans=0; for(int i=a;i<=b;) { int x=i/sz; if(i%sz==0&&i+sz-1<=b) { ans+=en[x]; i+=sz; } else { ans+=num[i]; i++; } } printf("%d\n",ans); } else if(s[0]=='A') { num[a]+=b; int x=a/sz; en[x]+=b; } else { b=-b; num[a]+=b; int x=a/sz; en[x]+=b; } } } return 0; }
posted on 2017-02-24 13:22 HelloWorld!--By-MJY 阅读(114) 评论(0) 编辑 收藏 举报