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的更多相关文章

  1. “盛大游戏杯”第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 描述 在一个矩形的灰度图像上,每个 ...

  2. codevs 1690 开关灯 线段树区间更新 区间查询Lazy

    题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...

  3. poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 75541   ...

  4. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  5. POJ-2528 Mayor's posters (线段树区间更新+离散化)

    题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...

  6. HDU5039--Hilarity DFS序+线段树区间更新 14年北京网络赛

    题意:n个点的树,每个条边权值为0或者1, q次操作 Q 路径边权抑或和为1的点对数, (u, v)(v, u)算2个. M i修改第i条边的权值 如果是0则变成1, 否则变成0 作法: 我们可以求出 ...

  7. hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  8. poj3468 A Simple Problem with Integers(线段树区间更新)

    https://vjudge.net/problem/POJ-3468 线段树区间更新(lazy数组)模板题 #include<iostream> #include<cstdio&g ...

  9. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

随机推荐

  1. libgdx学习记录18——Box2d物理引擎

    libgdx封装了Box2D物理引擎,通过这个引擎能够模拟物理现实,使设计出的游戏更具有真实感. libgdx中,Box2d程序的大概过程: 1. 创建物理世界world,并设置重力加速度. 2. 创 ...

  2. 设计模式 笔记 原型模式 prototype

    //---------------------------15/04/07---------------------------- //prototype 原型模式--对象创建型模式 /* 1:意图: ...

  3. wireshark找不到网卡

    在Capture Opinions中的interface若找不到网卡,一般是npf服务没有启动. npf是什么东东 Netgroup Packet Filter 网络数据包过滤器 NPF Device ...

  4. 广州区块链系统or积分联盟

    区块链技术开发至今已有十年,从概念的现世到如今初步应用,区块链开发公司在各个领域开始发光发热,很多人都想参与其中,通过区块链开发实现企业转型来适应未来市场,也有一些初创者希望借此实现创业意图,但在诸多 ...

  5. LeetCode 628. Maximum Product of Three Numbers三个数的最大乘积 (C++)

    题目: Given an integer array, find three numbers whose product is maximum and output the maximum produ ...

  6. c# dataGridView cell添加下拉框

    应用场景: dataGridView需要某一个cell变成下拉框样式. 思路详解: dataGridVie添加固定格式的row. 代码: DataGridViewRow row = new DataG ...

  7. 四则运算APP最后阶段

    四则运算APP最后阶段 [开发环境]:eclipse [开发项目]:小学生四则运算APP [开发人员]:郑胜斌 http://www.cnblogs.com/zsb1/ 孔德颖 http://www. ...

  8. 第三周作业:Visual Studio 2013

    在装Visual Studio 2013的时候,提示我升级我的电脑,不然不给安装,于是我就各种升级,完事之后有了这个: 在我耐心的等待之下终于等到安装完成: 我就建立一个新的项目: 我就写了一个简单程 ...

  9. CodeM Qualifying Match Q5

    问题描述: 给定两个整数 l 和 r ,对于所有满足1 ≤ l ≤ x ≤ r ≤ 10^9 的 x ,把 x 的所有约数全部写下来. 对于每个写下来的数,只保留最高位的那个数码.求1-9每个数码出现 ...

  10. sql server获取当前月的天数

    方法1 SELECT 32-DAY(getdate()+32-DAY(getdate())) 方法2 CREATE FUNCTION dbo.fn_getMonthDayAll ---自定义函数名称 ...