线段树区间更新 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 ...
随机推荐
- 20155317 十六周second 取值
20155317 十六周second 取值 题目如下图: secondset #define base 0xFFFFC0000 # #define &clock void setsecond( ...
- Command and Query Responsibility分离模式
CQRS模式,就是命令和查询责任分离模式. CQRS模式通过使用不同的接口来分离读取数据和更新数据的操作.CQRS模式可以最大化性能,扩展性以及安全性,还会为系统的持续演化提供更多的弹性,防止Upda ...
- python 回溯法 子集树模板 系列 —— 9、旅行商问题(TSP)
问题 旅行商问题(Traveling Salesman Problem,TSP)是旅行商要到若干个城市旅行,各城市之间的费用是已知的,为了节省费用,旅行商决定从所在城市出发,到每个城市旅行一次后返回初 ...
- servelt filter listener 的生命周期
1. servlet 当第一次请求一个servlet资源时,servlet容器创建这个servlet实例,并调用他的 init(ServletConfig config)做一些初始化的工作,然后 ...
- DokuWiki 使用
新建文件夹 修改url, 将新文件夹的名称赋值给url上的id, 如要建一个"DokuWiki"的文件夹,并在文件夹下新增一个"QuickStart"的页面,改 ...
- linux下tomcat指定jdk和配置运行参数
一.指定运行jdk 1)set classpath.sh和catalina.sh中写入: export JAVA_HOME=/usr/local/java/jdk1.8.0_121 export JR ...
- Frida----安装
介绍 它是本机应用程序的 Greasemonkey,或者更多技术术语,它是一个动态代码检测工具包.它允许您将JavaScript或您自己的库的片段注入Windows,macOS,GNU / Linux ...
- ats反向代理和重定向
作为反向代理缓存,ats代表源服务器提供的请求. ats的配置方式使客户端看起来像普通的原始服务器. 了解反向代理缓存通过转发代理缓存, ats代表请求内容的客户端队里对源服务器的web请求.反向代理 ...
- openstack删除僵尸卷
问题描述: 最近在清理openstack环境,在删除cinder云硬盘时,一直发现有两个卷在删除中. 解决方法如下: 首先我们去cinder的数据库中找到这个卷,命令为: MariaDB [(none ...
- 谈谈我对Manacher算法的理解
Manacher算法其实是求字符串里面最长的回文. ①在学习该算法前,我们应该知道回文的定义:顺序读取回文和逆序读取回文得到的结果是一样的,如:abba,aba. 那么我们不难想到,在判断一个字符串s ...