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 ,别的没什么大 ...
随机推荐
- GitLab 环境搭建【CentOS7】
RPM安装方式 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7 [最好给服务器分配至少4G内存] 先检查一下依赖:sshd [root@l ...
- 洛谷 P2622 关灯问题II(状压DP入门题)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int n,m; ];//a[i][j] : 第i个开关对第j个 ...
- Gym - 101755G Underpalindromity (树状数组)
Let us call underpalindromity of array b of length k the minimal number of times one need to increme ...
- TCP多线程聊天室
TCP协议,一个服务器(ServerSocket)只服务于一个客户端(Socket),那么可以通过ServerSocket+Thread的方式,实现一个服务器服务于多个客户端. 多线程服务器实现原理— ...
- mysql优化好文
https://segmentfault.com/a/1190000006158186
- ajax传值修改数据
主界面代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
- python对象的不同参数集合
如下,我们已经有了一个从Contact类继承过来的Friend类 class ContactList(list): def search(self, name): '''Return all cont ...
- MySQL常见报错汇总
1>.ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it canno ...
- css3 transition和animation的区别与联系
1. transition 一定时间之内,一组css属性变换到另一组属性的动画展示过程. 属性: transition-property:动画展示哪些属性,可以使用all关键字: transition ...
- bootstrap实现checkbox全选、取消全选
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- 最新版本的 ...