题目大意:
有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关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?