数列分块入门 1 LOJ6277
2024-08-25 16:50:51
题目描述
给出一个长为 n 的数列,以及 n 个操作,操作涉及区间加法,单点查值。
输入格式
第一行输入一个数字 n。
第二行输入 n 个数字,第 iii 个数字为 ai,以空格隔开。
接下来输入 n 行询问,每行输入四个数字 opt、l、r、c,以空格隔开。
若 opt=0,表示将位于 [l,r] 的之间的数字都加 c。
若 opt=1,表示询问 ar 的值(ll和 c忽略)。
输出格式
对于每次询问,输出一行一个数字表示答案。
样例
样例输入
4
1 2 2 3
0 1 3 1
1 0 1 0
0 1 2 2
1 0 2 0
样例输出
2
5
题解:
分块写法
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=50000+10; ll a[MAXN];
int block,num; //块大小 块数量
int belong[MAXN],l[MAXN],r[MAXN];//归属那一块,块左右端点
ll sum[MAXN]; // 块的信息修改
int n;
void build()
{
block=sqrt(n);
num=n/block;
if(n%block!=0) num++; // 不能被整分。
for (int i = 1; i <= num ; ++i) {
l[i]=(i-1)*block+1;r[i]=i*block;
}
r[num]=n;
for (int i = 1; i <=n ; ++i) {
belong[i]=(i-1)/block+1;
}
}
void updata(int x,int y,int c)
{
for (int i = x; i <=min(r[belong[x]],y) ; ++i) {// 注意此处取两者最小值
a[i]+=c;
}
if(belong[x]!=belong[y])
for (int i = l[belong[y]]; i <=y ; ++i) {
a[i]+=c;
}
for (int i = belong[x]+1; i <=belong[y]-1 ; ++i) {
sum[i]+=c;
} }
ll ask(int x)
{
return a[x]+sum[belong[x]];
}
int main()
{
scanf("%d",&n);
memset(sum,0, sizeof(sum));
for (int i = 1; i <=n ; ++i) {
scanf("%lld",&a[i]);
}
int op,x,y,c;
build();
for (int i = 1; i <=n ; ++i) {
scanf("%d%d%d%d",&op,&x,&y,&c);
if(op==0)
{
updata(x,y,c);
} else
{
printf("%lld\n",ask(y));
}
}
return 0;
}
最新文章
- Height Half Values
- 【CodeVS 1993】草地排水 isap模板题
- JS重点特性——闭包详解
- log4j的ConversionPattern参数的格式含义-转
- HighCharts开发说明
- 64位Ubuntu 13.04 安装Bochs 2.3.5
- Python的 is 运算符
- c#中用DirectShow实现媒体播放器的核心(1) DirectShow简介
- Html5所见即所得的几款框架
- jquery ui 笔记
- 解决ZF2_PATH environment
- kairosdb + cassandra Setup
- python-继承类执行的流程
- 201521123016《Java程序设计》第10周学习总结
- Yii2之事件
- [Python Study Notes] Python的安装
- 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)
- AE二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)
- 【转】linux防火墙配置
- Fiddler抓包手机代理配置
热门文章
- 通过bat设置系统环境变量
- TP5.0:跳转链接到某控制器下的某方法
- 【转载】#443 - An Interface Cannot Contain Fields
- 为什么A经理的团队总是会陷入加班与救火之中
- 解决svn中“工作副本已经锁定”,或者svn清理失败的解决方法
- BZOJ3531:[SDOI2014]旅行(树链剖分)
- Codeforces Round #422 (Div. 2)
- php new self()关键字的用法
- js 注册控件的onclick事件
- PAT (Basic Level) Practise (中文)-1040. 有几个PAT(25)