数列分块入门 1
2018-06-17 20:43:19来源:未知 阅读 ()
题目描述
输入格式
输出格式
思路:
最简单的数列分块
先明确一波分块的概念:
将一个长为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;
}
}
}
}
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Window中的shellcode编写框架(入门篇) 2020-03-31
- 蓝桥杯练习(入门一) 2020-03-23
- c语言该怎么入门?C语言入门教程(非常详细) 2020-02-17
- 习题2-6:排列 2019-12-30
- C++入门到理解阶段二基础篇(9)——C++结构体 2019-11-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
