A Simple Problem with Integers POJ - 3468 (分块)
题目链接:https://cn.vjudge.net/problem/POJ-3468
题目大意:区间加减+区间查询操作。
具体思路:本来是一个线段树裸题,为了学习分块就按照分块的方法做吧。
分块真的好暴力,,,(但是还是挺优美的)。
说一下各个数组的作用。
a数组,代表每一个点的值。
sum数组,代表分块后每一段的值。
add数组,相当于线段树中的lazy标记,记录的数当前这一整段添加的值。
l数组,r数组,记录每一段的左端点和右端点。
belong数组,记录每一个数属于哪一个分块中。
AC代码:
#include<iostream>
#include<stack>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<math.h>
using namespace std;
# define ll long long
const int maxn = 1e6+;
ll a[maxn],sum[maxn],add[maxn];
int l[maxn],r[maxn];
int belong[maxn];
void buildblock(int t){
int tmp=(int)sqrt(t*1.0);
int tot=t/tmp;
if(t%tmp)tot++;
for(int i=;i<=t;i++){
belong[i]=(i-)/tmp+;
}
for(int i=;i<=tot;i++){
l[i]=(i-)*tmp+;
r[i]=i*tmp;
}
r[tot]=t;
for(int i=;i<=tot;i++){
for(int j=l[i];j<=r[i];j++){
sum[i]+=a[j];
}
}
}
void update(int st,int ed,ll val){
if(belong[st]==belong[ed]){
for(int i=st;i<=ed;i++){
a[i]+=val;
sum[belong[st]]+=val;
}
return ;
}
for(int i=st;i<=r[belong[st]];i++){
a[i]+=val;
sum[belong[st]]+=val;
}
for(int i=l[belong[ed]];i<=ed;i++){
a[i]+=val;
sum[belong[ed]]+=val;
}
for(int i=belong[st]+;i<belong[ed];i++){
add[i]+=val;
}
}
ll ask(int st,int ed){
ll ans=;
if(belong[st]==belong[ed]){
for(int i=st;i<=ed;i++){
ans+=a[i]+add[belong[st]];
}
return ans;
}
for(int i=st;i<=r[belong[st]];i++){
ans+=a[i]+add[belong[st]];
}
for(int i=l[belong[ed]];i<=ed;i++){
ans+=a[i]+add[belong[ed]];
}
for(int i=belong[st]+;i<belong[ed];i++){
ans+=sum[i]+add[i]*(r[i]-l[i]+);
}
return ans;
}
int main(){
//freopen("hqx.in","r",stdin);
int n,m;
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
}
buildblock(n);
char str[];
int st,ed;
ll cost;
while(m--){
scanf("%s",str);
if(str[]=='Q'){
scanf("%d %d",&st,&ed);
printf("%lld\n",ask(st,ed));
}
else if(str[]=='C'){
scanf("%d %d %lld",&st,&ed,&cost);
update(st,ed,cost);
}
}
return ;
}
A Simple Problem with Integers POJ - 3468 (分块)的更多相关文章
- A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 69589 ...
- A Simple Problem with Integers~POJ - 3468
You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of op ...
- C - A Simple Problem with Integers - poj 3468(区间更新)
题意:有一个比较长的区间可能是100000.长度, 每个点都有一个值(值还比较大),现在有一些操作,C abc, 把区间a-b内全部加上c, Qab,求区间ab的值. 分析:很明显我们不可能对区间的每 ...
- C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)
参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...
- A Simple Problem with Integers POJ - 3468 (线段树)
思路:线段树,区间更新,区间查找 #include<iostream> #include<vector> #include<string> #include< ...
- A Simple Problem with Integers POJ - 3468 线段树区间修改+区间查询
//add,懒标记,给以当前节点为根的子树中的每一个点加上add(不包含根节点) // #include <cstdio> #include <cstring> #includ ...
- C - A Simple Problem with Integers
C - A Simple Problem with Integers POJ - 3468 思路:线段树区间修改区间查询.又出现了 C++ WA G++ AC的尴尬局面. #include& ...
- POJ 3468 A Simple Problem with Integers(分块入门)
题目链接:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS Memory Limit ...
- POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)
POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...
随机推荐
- linux 系统调用之文件操作
fcntl 文件控制 open 打开文件 creat 创建新文件 close 关闭文件描述字 read 读文件 write 写文件 readv 从文件读入数据到缓冲数组中 writev 将缓冲数组里的 ...
- http uri唯一标识
URI:唯一标识并且信息资源(简单理解为:发邮件的地址,身份证号).uri包括url 比如通过查找一个uri,找到一张图片“https://timgsa.baidu.com/timg?image&am ...
- Unity 着色器
Unity中定义了很多种Shader类型,同样的Shader类型我们可以自定义,需要用到ShaderLab着色语言. 一个3D图形是怎样显示在我们的视觉? 3D数据文件-----3D显示程序----- ...
- ES6(promise)_解决回调地狱初体验
一.前言 通过这个例子对promise解决回调地狱问题有一个初步理解. 二.主要内容 1.回调地狱:如下图所示,一个回调函数里面嵌套一个回调函数,这样的代码可读性较低也比较恶心 2.下面用一个简单的例 ...
- 关键字(8):数据库记录的增删查改insert,delete,select,update
insert:一般只要参数个数和类型没问题,不会插入异常 INSERT INTO t_pos_dynamic_map(autoid, lt_termno, lt_merchno) VALUES(SEQ ...
- SQL Server索引的作用
一.深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(noncl ...
- bzoj2957 奥妙重重的线段树
https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树的query和update竟然还可以结合起来用! 题意:小A的楼房外有一大片施工工地, ...
- 6-(基础入门篇)学会编译lua固件,固件的合成
http://www.cnblogs.com/yangfengwu/p/9336274.html 基础教程源码链接请在淘宝介绍中下载,由于链接很容易失效,如果失效请联系卖家,谢谢 https://it ...
- python 函数基础及装饰器
没有参数的函数及return操作 def test1(): print ("welcome") def test2(): print ("welcomt test2&qu ...
- Elastic Stack之Redis集群使用
Elastic Stack之Redis集群使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客数据流走向:FileBeat ===>Redis ===>lo ...