您当前的位置: 首页 > 

暂无认证

  • 3浏览

    0关注

    97958博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

PKU 3468 A Simple Problem with Integers

发布时间:2014-12-14 16:37:04 ,浏览量:3

题目大意: 有N,M两个数 Q 表示查询, 后面两个数a b,表示查询从a 到b计算它们的和 C 表示增加   后面三个数a,b,c 表示从a开始,一直到b,每个数都增加c

除了查询要进行输出,增加不要输出

#includeusing namespace std;
#define LL(x)((x)<<1)
#define RR(x)((x)<<1|1)
struct_Seg_Tree{
   int left,right;
   long long sum;
   int add;
   int calmid(){
       return (left+right)/2;
   }
   int caldis(){
       return right-left+1;
   }
}tt[1000000];
int val[1000002];

long long build(int l,int r,int idx){
   tt[idx].left=l;
   tt[idx].right=r;
   tt[idx].add=0;
   if(l==r){
      return tt[idx].sum=val[l];
   }
   return tt[idx].sum=build(l,mid,LL(idx)+build(mid+1,r,RR(idx)));
}     

void update(int l,int r,int add,int idx){
   if(l<=tt[idx].left&&r>=tt[idx].right){
       tt[idx].add+=add;
       tt[idx].sum+=(long long)tt[idx].caldis()*add;//通过乘以后来添加的数 
       return ; 
   }
   if(tt[idx].add){
       tt[LL(idx).sum]+=(long long)tt[LL(idx)].caldis()*tt[idx].add;
       tt[RR(idx).sum]++(long long)tt[RR(idx)].caldis()*tt[idx].add;
       tt[LL(idx)].add+=tt[idx].add;
       tt[RR(idx)].add+=tt[idx].add;
       tt[idx].add=0; 
   
   }
   int mid=tt[idx].calmid();
   if(l<=mid) update(l,r,add,LL(idx));
   if(mid            
关注
打赏
1655516835
查看更多评论
立即登录/注册

微信扫码登录

0.0482s