问题 A: 区间查询
时间限制: 2 Sec 内存限制: 32 MB
提交: 198 解决: 107
[提交][状态][讨论版][命题人:外部导入]
题目描述
食堂有N个打饭窗口,现在正到了午饭时间,每个窗口都排了很多的学生,而且每个窗口排队的人数在不断的变化。
现在问你第i个窗口到第j个窗口一共有多少人在排队?
输入
输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是一个正整数N(N<=30000),表示食堂有N个窗口。
接下来一行输入N个正整数,第i个正整数ai表示第i个窗口最开始有ai个人排队。(1<=ai<=50)
接下来每行有一条命令,命令有四种形式:
(1)Add i j,i和j为正整数,表示第i个窗口增加j个人(j不超过30);
(2)Sub i j,i和j为正整数,表示第i个窗口减少j个人(j不超过30);
(3)Query i j,i和j为正整数,i<=j,表示询问第i到第j个窗口的总人数;
(4)End 表示结束,这条命令在每组数据最后出现;
每组数据最多有40000条命令。
输出
对于每组输入,首先输出样例号,占一行。
然后对于每个Query询问,输出一个整数,占一行,表示询问的段中的总人数,这个数保持在int以内。
样例输入
1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
样例输出
Case 1: 6 33 59
#include<bits/stdc++.h>
using namespace std;
int main(){
int T,n,x,y;
string s;
cin>>T;
for(int Case=1;Case<=T;Case++){
cout<<"Case "<<Case<<":"<<endl;
cin>>n;
int c[30050]={0},w[310]={0};
for(int i=1;i<=n;i++){
cin>>x;
c[i]=x;w[i/100]+=x;//c存每个食堂,w存分块每块100个食堂
}
while(cin>>s){
if(s=="Add"){
cin>>x>>y;
c[x]+=y;w[x/100]+=y;
}
else if(s=="Sub"){
cin>>x>>y;
c[x]-=y;w[x/100]-=y;
}
else if(s=="Query"){
cin>>x>>y;
int sum=0;
if(y-x<=200){
for(int i=x;i<=y;i++){
sum+=c[i];
}
}else{
for(int i=x/100+1;i<y/100;i++) sum+=w[i];
for(int i=x;i<=(x/100)*100+99;i++) sum+=c[i];
for(int i=(y/100)*100;i<=y;i++) sum+=c[i];
}
cout<<sum<<endl;
}
else break;
}
}
return 0;
}