题解 P3372 【【模板】线段树 1】
发一篇不需要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】的更多相关文章
- 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 ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 【线段树】【P3372】模板-线段树
百度百科 Definition&Solution 线段树是一种log级别的树形结构,可以处理区间修改以及区间查询问题.期望情况下,复杂度为O(nlogn). 核心思想见百度百科,线段树即将每个 ...
- hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...
- [NOIP10.6模拟赛]2.equation题解--DFS序+线段树
题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...
- 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
实现功能——对于一个N×M的方格,1:输入一个区域,将此区域全部值作加法:2:输入一个区域,求此区域全部值的和 其实和一维线段树同理,只是不知道为什么速度比想象的慢那么多,求解释...@acphile ...
- 【题解】Journeys(线段树优化连边)
[#3073. Pa2011]Journeys (线段树优化连边) 这张图太直观了,直接讲透了线段树优化连边的原理和正确性. 考虑建立两颗线段树,一颗是外向树,一颗是内向树,相当于网络流建模一样,我们 ...
- Gorgeous Sequence 题解 (小清新线段树)
这道题被学长称为“科幻题” 题面 事实上,并不是做法科幻,而是“为什么能这么做?”的解释非常科幻 换句话说,复杂度分析灰常诡异以至于吉如一大佬当场吃书 线段树维护的量:区间和sum,区间最大值max1 ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- [NOI2016]区间 题解(决策单调性+线段树优化)
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1593 Solved: 869[Submit][Status][ ...
随机推荐
- delphi中将 4 个 Byte 合成 1 个 Integer 的五种方法
有4个字节类型的值,用移位或逻辑运算符怎么合成一个整数?比如 $FFEEDDCC.高$FF$EE$DD$CC低 //方法 1: 共用内存procedure TForm1.Button1Click(Se ...
- linux基础学习8
管理主机每天任务: 查询登录档.追踪流量.监控用户使用主机状态.主机各项硬设备状态. 主机软件更新查询.其他使用者要求: 因此shell script 就必须要学啊,虽然可以说绝大部分shell能 ...
- [转]使用Wireshark来检测一次HTTP连接过程
Wireshark是一个类似tcpdump的嗅探软件,界面更人性化一些,今天我用它来检测一次HTTP连接过程. 安装好之后,先配置一下,选择Capture->Options,先设定你要嗅探的网络 ...
- pair类型
pair是一个模板数据类型,其中包含两个数据值,两个数据值可以不同 如 pair<int,string>a(2,"fgh");则a是一个pair类型,它包括两个数据,第 ...
- 15、Spring Boot使用Druid和监控配置【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/52001740目录(?)[-] 1添加Maven依赖 或jar包 2配置数据源相关信息 3 ...
- AAuto如何设置定时器
在设计视图中(一定要有个Form)点击左下角的功能组件 点击定时器即可切换到代码视图,并添加如下代码.其中我每隔一秒改变一下winform.static2.text的文本值
- Openstack nova代码部分凝视一
做个一个没怎么学过python的菜鸟.看源代码是最好的学习方式了,如今就从nova入手,主要凝视一下 nova/compute/api.py 中的 create_instance函数 def _cre ...
- Php网站如何优化才好?
尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非 ...
- Linux学习日志--共享内存
一:什么是共享内存 共享内存是属于IPC(Inter-Process Communication进程间通信)机制,其它两种是信号量和消息队列,该机制为进程开辟创建了特殊的地址范 ...
- oracle恢复已经删除的数据
insert into tablerestore select * from tablerestore as of timestamp to_Date('2014-8-8 15:00:00','yyy ...