记录编号 542459 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 GravatarCSU_Turkey 是否通过 通过
代码语言 C++ 运行时间 2.456 s
提交时间 2019-09-25 18:44:24 内存使用 16.71 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define LL long long
#define dl double
void rd(int &x){
 x=0;int f=1;char ch=getchar();
 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 while(ch<='9' && ch>='0')x=x*10+ch-'0',ch=getchar();x*=f;
}
void lrd(LL &x){
 x=0;int f=1;char ch=getchar();
 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 while(ch<='9' && ch>='0')x=x*10+ch-'0',ch=getchar();x*=f;
}
const int INF=1e9;
const LL LINF=1e18;
const int inf=1e5+10;
using namespace std;
int n,m,len;
char s[10];
LL a[inf];
LL sum[inf];//sqrt(inf)即可 
int bel[inf];
namespace fk1{
 LL get_sum(int l,int r){
  LL ans=0;
  if(bel[l] == bel[r]){//特判l,r在同一块内情况 
   for(int i=l;i<=r;i++)ans+=a[i];
   return ans;
  }
  for(int i=bel[l]+1;i<bel[r];i++)ans+=sum[i];
  int tmp=bel[l]*len;
  for(int i=l;i<=tmp;i++)ans+=a[i];
  tmp=(bel[r]-1)*len+1;
  for(int i=tmp;i<=r;i++)ans+=a[i];
  return ans;
 }
 void modify(int x,int y){
  a[x]+=y;sum[bel[x]]+=y;
 }
 void does(){
  for(int i=1;i<=m;i++){
   int x,y;
   scanf("%s",s);rd(x);rd(y);
   if(s[0] == 'S')printf("%lld\n",get_sum(x,y));
   else modify(x,y);
  }
 }
}
namespace fk2{
 int tag[inf];
 void add(int l,int r,int val){
  if(bel[l] == bel[r]){
   for(int i=l;i<=r;i++)a[i]+=val;
   return ;
  }
  for(int i=bel[l]+1;i<bel[r];i++)tag[i]+=val;
  int tmp=bel[l]*len;
  for(int i=l;i<=tmp;i++)a[i]+=val;
  tmp=(bel[r]-1)*len+1;
  for(int i=tmp;i<=r;i++)a[i]+=val;
 }
 void does(){
  for(int i=1;i<=m;i++){
   scanf("%s",s);int x,y,z;
   if(s[0] == 'A'){
    rd(x);rd(y);rd(z);
	add(x,y,z);
   }
   else rd(x),printf("%d\n",a[x]+tag[bel[x]]);
  }
 }
}
namespace fk3{
 LL tag[inf];
 void add(int l,int r,LL val){
  if(bel[l] == bel[r]){
   for(int i=l;i<=r;i++)a[i]+=val,sum[bel[l]]+=val;
   return ;
  }
  for(int i=bel[l]+1;i<bel[r];i++)tag[i]+=val;
  int tmp=bel[l]*len;
  for(int i=l;i<=tmp;i++)a[i]+=val,sum[bel[l]]+=val;
  tmp=(bel[r]-1)*len+1;
  for(int i=tmp;i<=r;i++)a[i]+=val,sum[bel[r]]+=val;
 }
 LL get_sum(int l,int r){
  LL ans=0;
  if(bel[l] == bel[r]){
   for(int i=l;i<=r;i++)ans+=a[i];
   ans+=tag[bel[l]]*(r-l+1);return ans;
  }
  for(int i=bel[l]+1;i<bel[r];i++)ans+=tag[i]*len+sum[i];
  int tmp=bel[l]*len;
  for(int i=l;i<=tmp;i++)ans+=tag[bel[l]]+a[i];
  tmp=(bel[r]-1)*len+1;
  for(int i=tmp;i<=r;i++)ans+=tag[bel[r]]+a[i];
  return ans;
 }
 void does(){
  for(int i=1;i<=m;i++){
   scanf("%s",s);int x,y;LL z;
   if(s[0] == 'A'){
    rd(x),rd(y),lrd(z);
    add(x,y,z);
   }
   else rd(x),rd(y),printf("%lld\n",get_sum(x,y));
  }
 }
}
int main(){
 freopen("shuliec.in","r",stdin);
 freopen("shuliec.out","w",stdout);
// freopen("in.txt","r",stdin);
 rd(n);len=sqrt(n);//这个不是一定的,需要进行复杂度分析 
 for(int i=1;i<=n;i++){
  lrd(a[i]);sum[bel[i]=(i-1)/len+1]+=a[i];//(i-1)可以保证整块包含元素数目一样,直接用i会导致第一个块元素个数少一个,因为是从1开始存的 
 }
 rd(m);
// fk1::does();
// fk2::does();
 fk3::does();
 return 0;
}
/*cogs 264
  cogs 1316
  cogs 1317
基础分块大礼包*/