题目传送门: Q A Q QAQ QAQ
思路
先来说说思路啊。
不是线段树就是树状数组了。
但是线段树又不会,还怕不是爆空间。
就用了线段树。
坑点
每组数据记得清零,两个数组都要!
优化时间。
TLE
后果自负!
代码
既然是个板子,就发代码吧!
cin
/cout
+ios::sync_with_stdio(false);
#include<bits/stdc++.h>
using namespace std;
int a[50005],c[50005];
int n;
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int i,int x)
{
int j;
for(j=i;j<=n;j+=lowbit(j))
c[j]+=x;
}
inline int prefix(int x)
{
int i;
int ans=0;
for(i=x;i;i-=lowbit(i))
ans+=c[i];
return ans;
}
inline void query(int x,int y)
{
cout<<prefix(y)-prefix(x-1)<<endl;
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
int t1=1;
int i;
while(t1<=t){
cin>>n;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
cin>>a[i];
add(i,a[i]);
}
cout<<"Case "<<t1<<":\n"; //这里不能用printf,因为用了ios::sync_with_stdio(false);之后会炸!详见:https://oi-wiki.org/intro/common-mistakes/
string s;
int x,y;
while(1){
cin>>s;
if(s=="End")
break;
else if(s=="Add"){
cin>>x>>y;
add(x,y);
}
else if(s=="Query"){
cin>>x>>y;
query(x,y);
}
else if(s=="Sub"){
cin>>x>>y;
add(x,-y);
}
}
t1++;
}
return 0;
}
scanf
/printf
#include<bits/stdc++.h>
using namespace std;
int a[50005],c[50005];
int n;
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int i,int x)
{
int j;
for(j=i;j<=n;j+=lowbit(j))
c[j]+=x;
}
inline int prefix(int x)
{
int i;
int ans=0;
for(i=x;i;i-=lowbit(i))
ans+=c[i];
return ans;
}
inline void query(int x,int y)
{
cout<<prefix(y)-prefix(x-1)<<endl;
}
int main()
{
int t;
scanf("%d",&t);
int t1=1;
int i;
while(t1<=t){
cin>>n;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
add(i,a[i]);
}
printf("Case %d:",t1);
string s;
int x,y;
while(1){
cin>>s; //这里必须用cin,因为string不资磁cin
if(s=="End")
break;
else if(s=="Add"){
scanf("%d%d",&x,&y);
add(x,y);
}
else if(s=="Query"){
scanf("%d%d",&x,&y);
query(x,y);
}
else if(s=="Sub"){
scanf("%d%d",&x,&y);
add(x,-y);
}
}
t1++;
}
return 0;
}