【分块】【线段树】bzoj3212 Pku3468 A Simple Problem with Integers
2024-08-29 10:47:57
线段树入门题……
因为poj原来的代码莫名RE,所以丧病地写了区间修改的分块……
其实就是块上打标记,没有上传下传之类。
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,a[],l[],r[],delta[],num[],sum,sz,x,y,v;
char op[];
long long sumv[];
void makeblock()
{
sz=sqrt(n);
for(sum=;sum*sz<n;sum++)
{
l[sum]=(sum-)*sz+;
r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];i++) {num[i]=sum; sumv[sum]+=a[i];}
}
l[sum]=sz*(sum-)+; r[sum]=n;
for(int i=l[sum];i<=r[sum];i++) {num[i]=sum; sumv[sum]+=a[i];}
}
inline void update()
{
if(num[x]+>=num[y]){for(int i=x;i<=y;i++) a[i]+=v;}
else
{
for(int i=x;i<=r[num[x]];i++) a[i]+=v;
for(int i=l[num[y]];i<=y;i++) a[i]+=v;
for(int i=num[x]+;i<num[y];i++) delta[i]+=v;
}
}
inline void query()
{
long long ans=;
if(num[x]+>=num[y]){for(int i=x;i<=y;i++) ans+=a[i];}
else
{
for(int i=x;i<=r[num[x]];i++) ans+=(long long)(delta[num[x]]+a[i]);
for(int i=l[num[y]];i<=y;i++) ans+=(long long)(delta[num[y]]+a[i]);
for(int i=num[x]+;i<num[y];i++) ans+=sumv[i]+(long long)((l[i]-r[i]+)*delta[i]);
}
printf("%lld\n",ans);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=m;i++)
{
scanf("%s%d%d",op,&x,&y);
if(op[]=='Q') query();
else {scanf("%d",&v); update();}
}
return ;
}
最新文章
- WEB项目会话集群的三种办法
- shc
- 做一个会使用PS的前端开发
- js文字无缝滚动
- Oracle 11g AMM与ASMM切换
- Minesweeper PC/UVa IDs: 110102/10189, Popularity: A,Success rate: high Level: 1
- sql查询结果集根据指定条件排序的方法
- 【set&;&;sstream||floyed判环算法】【UVa 11549】Calculator Conundrum
- JS滚动加载
- ionic2 tabs使用自定义图标
- 微信小程序教学第三章(含视频):小程序中级实战教程:列表-页面逻辑处理
- Solr6.0与Jetty、Tomcat在Win环境下搭建/部署
- Netty基础系列(1) --linux网路I/O模型
- 微信小程序,转盘抽奖
- 『高次同余方程 Baby Step Giant Step算法』
- web开篇
- int 和 Integer
- 6、JPA-映射-单向一对多
- gdb调试若干问题
- 为网站添加emoji表情的支持