数列分块入门 1
Posted ztz11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数列分块入门 1相关的知识,希望对你有一定的参考价值。
题目描述
输入格式
输出格式
思路:
最简单的数列分块
先明确一波分块的概念:
将一个长为n数列拆成k块儿(一般k=sqrt(n));
然后对区间的修改变为对完整块的修改和对区间两端不完整块的暴力
那如何描述对区间的修改和查询呢?
lazy大法好!!
建一个标记数组,存储对整个区间的修改
最后输出标记数组与原值的和即可
代码:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int x[50005],sy[50005],fk[50005],n,opt,l,r,c,a,b,d,dx,cnt,bnt; int main() { // freopen("a1.in","r",stdin); // freopen("1.out","w",stdout); cin>>n; dx=sqrt(n); bnt=1; for(a=1;a<=n;a++) { scanf("%d",&x[a]); sy[a]=(a-1)/dx+1; } for(a=1;a<=n;a++) { scanf("%d%d%d%d",&opt,&l,&r,&c); if(opt==1) { printf("%d\n",x[r]+fk[sy[r]]); } else { if(sy[l]==sy[r]) { for(b=l;b<=r;b++) { x[b]+=c; } continue; } int lf,ri; lf=sy[l]; ri=sy[r]; for(b=l;b<=lf*dx;b++) { x[b]+=c; } for(b=(ri-1)*dx+1;b<=r;b++) { x[b]+=c; } for(b=lf+1;b<=ri-1;b++) { fk[b]+=c; } } } }
以上是关于数列分块入门 1的主要内容,如果未能解决你的问题,请参考以下文章