线段树区间更新 lazy
1.
hdu1698
http://acm.hdu.edu.cn/showproblem.php?pid=1698
/*
x y k
x~y的值变为k
*/
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <time.h>
#include <string>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <ext/rope>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll long long
#define minv 1e-6
#define inf 1e9
#define pi 3.1415926536
#define E 2.7182818284
const ll mod=1e9+;//
const int maxn=1e5+; int tag[maxn<<],sum[maxn<<]; void push_down(int index,int len)
{
tag[index<<]=tag[index<<|]=tag[index];
sum[index<<]=((len+)>>)*tag[index];
sum[index<<|]=(len>>)*tag[index];
tag[index]=;
} void build(int index,int l,int r)
{
tag[index]=;
if (l==r)
sum[index]=;
else
{
int m=(l+r)>>;
build(index<<,l,m);
build(index<<|,m+,r);
sum[index]=sum[index<<]+sum[index<<|];
}
} void update(int index,int l,int r,int x,int y,int k)
{
if (x<=l && r<=y)
{
tag[index]=k;
sum[index]=(r-l+)*k;
return;
}
if (tag[index]!=)
push_down(index,r-l+);
int m=(l+r)>>;
if (x<=m)
update(index<<,l,m,x,y,k);
if (m<y)
update(index<<|,m+,r,x,y,k);
sum[index]=sum[index<<]+sum[index<<|];
} int query(int index,int l,int r,int s,int t)
{
if (s<=l && r<=t)
return sum[index];
if (r<s || l>t)
return ;
if (tag[index]!=)
push_down(index,r-l+);
int m=(l+r)>>;
return query(index<<,l,m,s,t)+query(index<<|,m+,r,s,t);
} int main()
{
int t,T,n,q,x,y,k;
scanf("%d",&t);
for (T=;T<=t;T++)
{
scanf("%d",&n);
build(,,n);
scanf("%d",&q);
while (q--)
{
scanf("%d%d%d",&x,&y,&k);
update(,,n,x,y,k);
}
printf("Case %d: The total value of the hook is %d.\n",T,query(,,n,,n));
}
return ;
}
2.
https://www.luogu.org/problemnew/show/P3372
不用取余
/* 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k 操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和
*/
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <time.h>
#include <string>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <ext/rope>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll long long
#define minv 1e-6
#define inf 1e9
#define pi 3.1415926536
#define E 2.7182818284
const ll mod=1e9+;//
const int maxn=1e5+; ll sum[maxn<<],tag[maxn<<]; void build(int index,int l,int r)
{
tag[index]=;
if (l==r)
{
scanf("%lld",&sum[index]);
sum[index]=sum[index];
}
else
{
int m=(l+r)>>;
build(index<<,l,m);
build(index<<|,m+,r);
sum[index]=sum[index<<]+sum[index<<|];
}
} void pushdown(int index,ll len)
{
sum[index<<]=tag[index]*((len+)>>) +sum[index<<];
sum[index<<|]=tag[index]*(len>>) +sum[index<<|];
tag[index<<]=tag[index]+ tag[index<<];
tag[index<<|]=tag[index]+ tag[index<<|];
tag[index]=;
} void update(int index,int l,int r,int x,int y,ll k)
{
if (x<=l && r<=y)
{
sum[index]=k*(r-l+) +sum[index];
tag[index]=k +tag[index];
return;
}
int m=(l+r)>>;
if (tag[index]!=)
pushdown(index,r-l+);
if (x<=m)
update(index<<,l,m,x,y,k);
if (m<y)
update(index<<|,m+,r,x,y,k);
sum[index]=sum[index<<]+sum[index<<|];
} ll query(int index,int l,int r,int x,int y)
{
if (x<=l && r<=y)
return sum[index];
if (r<x || l>y)
return ;
if (tag[index]!=)
pushdown(index,r-l+);
int m=(l+r)>>;
return query(index<<,l,m,x,y)+query(index<<|,m+,r,x,y);
} int main()
{
int n,m,mode,x,y;
ll k;
scanf("%d%d",&n,&m);
build(,,n);
while (m--)
{
scanf("%d",&mode);
if (mode==)
{
scanf("%d%d%lld",&x,&y,&k);
update(,,n,x,y,k);
}
else
{
scanf("%d%d",&x,&y);
printf("%lld\n",query(,,n,x,y));
}
}
return ;
}
/*
10
463 793 740 374 330 772 681
5 8 39
5 8
3 6 3
5 8 90
1 5 21
3 8
3 8 17
4 7 52
2 6
2 7 41
5
2 3 4 5
1 3 -1
1 3 1
2 4
100
2 3 4 5 6 7 8 9 10
1 10
2 7 1
1 10
3 8 */
3.
https://www.luogu.org/problemnew/show/P3373
/*
1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和
*/
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <time.h>
#include <string>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <ext/rope>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll long long
#define minv 1e-6
#define inf 1e9
#define pi 3.1415926536
#define E 2.7182818284
//const ll mod=1e9+7;//
const int maxn=1e5+; ll mod;
ll add[maxn<<],mul[maxn<<],sum[maxn<<];
int mode; void build(int index,int l,int r)
{
add[index]=;
mul[index]=;
if (l==r)
{
scanf("%lld",&sum[index]);
sum[index]=sum[index]%mod;
}
else
{
int m=(l+r)>>;
build(index<<,l,m);
build(index<<|,m+,r);
sum[index]=(sum[index<<]+sum[index<<|])%mod;
}
} void pushdown(int index,ll len)
{
//(x *y+z)*s+t = x*(ys) + z*s+t
add[index<<]=(add[index<<]*mul[index]+add[index])%mod;
mul[index<<]=mul[index]*mul[index<<]%mod;
sum[index<<]=(sum[index<<]*mul[index]+add[index]*((len+)>>))%mod; add[index<<|]=(add[index<<|]*mul[index]+add[index])%mod;
mul[index<<|]=mul[index]*mul[index<<|]%mod;
sum[index<<|]=(sum[index<<|]*mul[index]+add[index]*(len>>))%mod; add[index]=;
mul[index]=;
} void update(int index,int l,int r,int x,int y,ll k)
{
if (x<=l && r<=y)
{
if (mode==)
{
//(x*y+z)*k
sum[index]=sum[index]*k%mod;
add[index]=add[index]*k%mod;
mul[index]=mul[index]*k%mod;
}
else
{
//(x*y+z)+k
sum[index]=(sum[index]+k*(r-l+))%mod;
add[index]=(add[index]+k)%mod;
}
return;
}
pushdown(index,r-l+);
int m=(l+r)>>;
if (x<=m)
update(index<<,l,m,x,y,k);
if (m<y)
update(index<<|,m+,r,x,y,k);
sum[index]=(sum[index<<]+sum[index<<|])%mod;
} ll query(int index,int l,int r,int x,int y)
{
if (x<=l && r<=y)
return sum[index];
if (x>r || y<l)
return ;
pushdown(index,r-l+);
int m=(l+r)>>;
return (query(index<<,l,m,x,y)+query(index<<|,m+,r,x,y))%mod;
} int main()
{
int n,q,x,y;
ll k;
scanf("%d%d%lld",&n,&q,&mod);
build(,,n);
while (q--)
{
scanf("%d%d%d",&mode,&x,&y);
if (mode!=)
{
scanf("%lld",&k);
update(,,n,x,y,k%mod);
}
else
printf("%lld\n",query(,,n,x,y));
}
return ;
}
/*
5 100 1000000
1 2 3 4 5
1 1 5 2
2 1 5 3
3 1 3 */
线段树区间更新 lazy的更多相关文章
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
- codevs 1690 开关灯 线段树区间更新 区间查询Lazy
题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 75541 ...
- hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- POJ-2528 Mayor's posters (线段树区间更新+离散化)
题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...
- HDU5039--Hilarity DFS序+线段树区间更新 14年北京网络赛
题意:n个点的树,每个条边权值为0或者1, q次操作 Q 路径边权抑或和为1的点对数, (u, v)(v, u)算2个. M i修改第i条边的权值 如果是0则变成1, 否则变成0 作法: 我们可以求出 ...
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- poj3468 A Simple Problem with Integers(线段树区间更新)
https://vjudge.net/problem/POJ-3468 线段树区间更新(lazy数组)模板题 #include<iostream> #include<cstdio&g ...
- hdu 3966(树链剖分+线段树区间更新)
传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...
随机推荐
- Android开发——为EditText添加烟花效果的实现
)什么时候发射烟花:监听EditText的文字改变,获取文字数量的变化以确定风的方向,还有获取光标的位置确定爆炸的位置.光标的位置没有具体的方法确定坐标,要通过反射自己计算. 2. 主要实现类 库里 ...
- [python]记录Windows下安装matplot的经历
最近学习在看<机器学习实战>一书,第二章的时候要用到Natplotlib画图,于是便开始安装Matplotlib.本文所用到的所有安装包都可以在文末的链接中找到. 首先从Matplotli ...
- POJ 2965&&1753
最近由于复习备考(然而考得还是很炸),很久没打题目了.现在开始刷寒假作业,不得不搞POJ 话说没有中文真的好烦啊! 先看1753 题目大意是说在一个4*4的格子中有黑白两色的棋子,你可以翻动其中的棋子 ...
- EZ 2017 01 07 t
这名字诡异(然而就是这样) 这次主要是yekehe和yu‘ao都来了,所以很开心的讨论(上了200). 但是,yu’ao dalao又AK了!(666666) 不过总体难度也不高,主要是T3没思路. ...
- python 回溯法 子集树模板 系列 —— 18、马踏棋盘
问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案. 分析 说明:这个图是5*5的棋盘. 图片来 ...
- 事务特性,事务的隔离级别,并发事务可能出现的问题,spring事务 数据库锁
1.0 事务特性(ACID) Atomicity:原子性,一个事务不可以被拆分 Consistency:一致性,在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态, ...
- WinForm 随手记
从今天开始咱们正式进入WinForm开发模式 首先很官方的介绍下什么是winform:客户端应用程序:C/S 这就是winform 有什么特别特别重要的特点呢:可以操作用户电脑上的文件 举个简单的例子 ...
- 总结com组件问题,随笔记录
一.从 IClassFactory 为 CLSID 为 {00024500-0000-0000-C000-000000000046} 的 COM 组件创建实例失败,原因是出现以下错误:80010001 ...
- 软件测试----H模型
H模型将测试活动完全独立出来,形成一个完整的流程,同时将测试准备和测试执行清晰表现出来. 测试流程: --测试准备:所有测试活动的准备判断是否到测试就绪点. --测试就绪点:测试准入准则,即是否可以开 ...
- Docker swarm集群搭建教程
一.什么是Swarm Swarm这个项目名称特别贴切.在Wiki的解释中,Swarm behavior是指动物的群集行为.比如我们常见的蜂群,鱼群,秋天往南飞的雁群都可以称作Swarm behavio ...