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. 利用git将项目上传到github

            本文主要介绍如果用git将项目上传到githup. 一.准备工作         (1)欲将项目上传到githup,先在githup上新建一个仓库.这里就不介绍.         (2 ...

  2. VS新建一个模板工程

    新建一个模板工程的好处:    1.就不用每次都走一边新建向导了,新建工程一步到位. 2.可以往项目中每次都的输入的代码,如一些声明注释-- 效果图: 具体步骤: 1.自己先新建一个属于自己的工程. ...

  3. C#Unit单元测试之读取Web.config文件

    长期一来,我们所完成的项目都没有写单元测试,今天我一时兴起,决定给自己写的代码写单元测试,简单的测试代码分分钟完成了,一运行测试,就懵逼了.没能达到我的预期效果,而是出现图1所示错误. 图1:单元测试 ...

  4. C语言学习之枚举类型

    前言 枚举(enum)类型是计算机编程语言中的一种数据类型.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把 ...

  5. Linux每天一个命令:cat

    Linux cat命令 命令:cat cat 命令用于连接文件并打印到标准输出设备上. 使用权限 所有使用者 语法格式 cat [-AbeEnstTuv] [--help] [--version] f ...

  6. stl源码剖析 详细学习笔记 算法(2)

    //---------------------------15/03/29---------------------------- //****************************set相 ...

  7. 【分享】熟练的Java程序员应该掌握哪些技术?

    Java程序员应该掌握哪些能力才能算是脱离菜鸟达到熟练的程度? 1.语法:Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息 知道是什么样的语法错误并且知道任 ...

  8. unity中利用纯物理工具制作角色移动跳跃功能

    using System.Collections;using System.Collections.Generic;using UnityEngine; public class Player : M ...

  9. 小学四则运算APP 第一个冲刺阶段 第四天

    团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第一次冲刺阶段时间:11.17~11.27 本次发布我们增加了CalculatorsActivity.java.YunsuanActivi ...

  10. 项目UML设计(团队)

    团队 队名 boy next door 队员 林晗 124(组长) 微博链接 显东 114 微博链接 基智 505 微博链接 松雄 126 微博链接 团队分工 分工表 任务 林晗 显东 基智 松雄 前 ...