发一篇不需要O2就能过的分块。

基本思路:

分块的思路,大段维护,小段朴素。

维护几个数组:

  • 区块\(block[maxn]\)
  • 懒标记\(tag[maxn]\)
  • 真实数据\(data[maxn]\)。

更新时

假设我们涉及到的区块的编号区间是\([lb,rb]\),真实数据范围为\([l,r]\)。

那么,我们在区块的\([lb+1,rb-1]\)区间,给\(block[i]\)加上\(\Delta k\) 并且打上懒标记 \(=\Delta k\)。在真实数据的\([l,lb\times N]\)和\([rb\times N-N+1,r]\)区间的每个\(data[i]\)加上\(\Delta k\)。

查询时

同样的,对于区块区间\([lb+1,rb-1]\)直接累加就好,对于\(l b\)区间和\(rb\)区间单独处理即可。

上丑陋无比的代码。注意特判\(l\)和\(r\)在一个区块区间的情况。

#include<bits/stdc++.h>
using namespace std;
template< class ccf >inline ccf qr(ccf a) {
char c=getchar();
ccf x=0;
int q=1;
while(c<48||c>57)
q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)
x=x*10+c-48,c=getchar();
return q==-1?-x:x;
}
const int maxn=100055;
typedef long long ll;
ll data[maxn];
ll tag[maxn];
ll blk[maxn];
int n;
int m;
int N;
int adj;
#define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;t++)
int t1,t2;
ll t3;
int temp; void add(int l,int r,ll k) {
int lb=(l+N-1)/N;
int rb=(r+N-1)/N;
if(lb!=rb) { RP(t,l,N*lb)
data[t]+=k,blk[lb]+=k;
RP(t,N*rb-N+1,r)
data[t]+=k,blk[rb]+=k;
RP(t,lb+1,rb-1)
tag[t]+=k,blk[t]+=N*k;
} else
RP(t,l,r)
data[t]+=k,blk[t]+=k;
} ll sum(int l,int r) {
ll ret=0;
int lb=(l+N-1)/N;
int rb=(r+N-1)/N;
RP(t,lb+1,rb-1)
ret+=blk[t];
if(tag[lb])
RP(t,N*lb-N+1,N*lb)
data[t]+=tag[lb];
tag[lb]=0;
if(tag[rb])
RP(t,N*rb-N+1,min(N*rb,n))
data[t]+=tag[rb];
tag[rb]=0;
if(lb!=rb) {
RP(t,l,N*lb)
ret+=data[t];
RP(t,N*rb-N+1,r)
ret+=data[t];
} else
RP(t,l,r)
ret+=data[t];
return ret;
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
n=qr(1);
m=qr(1);
RP(t,1,n)
data[t]=qr(1ll);
N=sqrt(n);
RP(t,1,n/N)
RP(i,1,N)
blk[t]+=data[(t-1)*N+i];
RP(t,1,n%N)
blk[n/N+1]+=data[(n/N)*N+t];
RP(t,1,m) {
temp=qr(1);
if(temp==1) {
t1=qr(1);
t2=qr(1);
t3=qr(1ll);
add(t1,t2,t3);
} else {
t1=qr(1);
t2=qr(1);
printf("%ld\n",sum(t1,t2));
}
}
return 0;
}

题解 P3372 【【模板】线段树 1】的更多相关文章

  1. hdu 1754 I Hate It (模板线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others)    M ...

  2. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  3. 【线段树】【P3372】模板-线段树

    百度百科 Definition&Solution 线段树是一种log级别的树形结构,可以处理区间修改以及区间查询问题.期望情况下,复杂度为O(nlogn). 核心思想见百度百科,线段树即将每个 ...

  4. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

  5. [NOIP10.6模拟赛]2.equation题解--DFS序+线段树

    题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...

  6. 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)

    实现功能——对于一个N×M的方格,1:输入一个区域,将此区域全部值作加法:2:输入一个区域,求此区域全部值的和 其实和一维线段树同理,只是不知道为什么速度比想象的慢那么多,求解释...@acphile ...

  7. 【题解】Journeys(线段树优化连边)

    [#3073. Pa2011]Journeys (线段树优化连边) 这张图太直观了,直接讲透了线段树优化连边的原理和正确性. 考虑建立两颗线段树,一颗是外向树,一颗是内向树,相当于网络流建模一样,我们 ...

  8. Gorgeous Sequence 题解 (小清新线段树)

    这道题被学长称为“科幻题” 题面 事实上,并不是做法科幻,而是“为什么能这么做?”的解释非常科幻 换句话说,复杂度分析灰常诡异以至于吉如一大佬当场吃书 线段树维护的量:区间和sum,区间最大值max1 ...

  9. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  10. [NOI2016]区间 题解(决策单调性+线段树优化)

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1593  Solved: 869[Submit][Status][ ...

随机推荐

  1. python正则表达式从路径中取文件名出来不加后缀(txt)

    正则表达式[^\\/:*?"<>|\r\n]+$ ---->取文件名包括后缀 e.g. >>>D:\PyCharm 2018.2.4\pythonWork ...

  2. ETL之Kettle

    Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行. 说白了就是,很有必要去理解一般ETL工具必备的特性和功能,这样才更好的掌握Kettle的使用. ...

  3. 使用PreloadJS加载图片资源

    一. 使用createjs里的LoadQueue函数实现异步加载图片,监听加载进度 1.实例对象LoadQueue加载队列对象 var queue = new createjs.LoadQueue(f ...

  4. python遍历当前目录并删除某文件

    #coding: utf-8 """ this programe is to clear driverlog below this dir __author__:the_ ...

  5. 【温故知新】——BABYLON.js学习之路·前辈经验(二)

    前言:在上一篇随笔BABYLON.js学习之路·前辈经验(一)中回顾了组内同事们长时间在Babylon开发实践中的总结出的学习之路和经验,这一篇主要对开发中常见的一些功能点做一个梳理,这里只作为温故知 ...

  6. JSON之—— JSON.parse()和JSON.stringify() (插曲)

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46391269 parse用于从一个字符串中解析出json对象,如 var str ...

  7. ListView嵌套两个EditText相关显示问题

    这里说明:本人第一次写博客,可能写的不算太好.可是这个相关类型的研究与拓展,是项目中比較难得的.所以开一篇博客来总结和思考.先让我们看看项目需求. 项目需求说明: 1.须要在点击EditText的时候 ...

  8. ionic 调试 "死亡白屏"

    死亡白屏(White Screen of Death) 我想“死亡白屏”应该是不需要解释的,开发过ionic app的童鞋应该都有遇到过,这里解释以防读者没有听说过:“可能在浏览器中调试时一切正常,当 ...

  9. Android Touch事件传递机制具体解释 下

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...

  10. SharePoint 2013 和 SharePoint 2010 功能对比

    微软的网站找东西太麻烦了,在这记录一下. 从 SharePoint 2010 更改为 SharePoint 2013 http://technet.microsoft.com/zh-cn/librar ...