kb-07线段树--11--区间多重该值多种查询
/*
lazy思想的运用,因为查询多种,如果全记录就太繁了,lazy就是如果该区间的每一个叶子的状态都相同就不用深入下去该值,只要暂时标记下,查询的时候也不用下去,直接计算; */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX_N 100005
#define mod 10007
#define ll long long
using namespace std;
struct tree
{
ll l,r,la[];
ll same,s;//s表示该区间的值都是s;
}tr[MAX_N*];
ll ans=;
void build(int rt,int l,int r)
{
tr[rt].l=l;
tr[rt].r=r;
tr[rt].same=;
tr[rt].s=;
memset(tr[rt].la,,sizeof(tr[rt].la));
tr[rt].la[]=;
if(l==r)
return ;
int mid=(l+r)/;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
}
void Pushdown(int rt)
{
if(tr[rt].same==)
{
int L=rt<<,R=rt<<|;
tr[L].la[]+=tr[rt].la[];
tr[L].la[]*=tr[rt].la[];
tr[L].la[]=tr[rt].la[];
tr[L].s=tr[R].s=tr[rt].s;
tr[R].la[]+=tr[rt].la[];
tr[R].la[]*=tr[rt].la[];
tr[R].la[]=tr[rt].la[];
tr[L].same=tr[R].same=;
tr[rt].la[]=;
tr[rt].la[]=;
tr[rt].la[]=;
tr[rt].same=;
}
return;
}
void Update(int rt,int l,int r,int x,int t)
{
if(t==)
{
if(tr[rt].l==l&&tr[rt].r==r&&tr[rt].same==)
{
tr[rt].la[]+=x;//关键;
tr[rt].la[]%=mod;
tr[rt].s=tr[rt].s+x;
return ;
}
}
else if(t==)
{
if(tr[rt].l==l&&tr[rt].r==r&&tr[rt].same==)
{
tr[rt].la[]*=x;
tr[rt].la[]%=mod;
tr[rt].s=tr[rt].s*x%mod;
return ;
}
}
else
{
if(tr[rt].l==l&&tr[rt].r==r)
{
tr[rt].la[]=x;
tr[rt].s=x;
tr[rt].same=;
return;
}
}
if(tr[rt].same==)
Pushdown(rt);
int L=rt<<,R=rt<<|;
if(l<=tr[L].r)
{
if(r<=tr[L].r)
Update(L,l,r,x,t);
else
Update(L,l,tr[L].r,x,t);
}
if(r>=tr[R].l)
{
if(l>=tr[R].l)
Update(R,l,r,x,t);
else
Update(R,tr[R].l,r,x,t);
}
}
void Query(int rt,int l,int r,int x)
{
if(tr[rt].l==l&&tr[rt].r==r&&tr[rt].same==)
{
ll n=r-l+,temp=;
for(int i=;i<=x;i++)
{
temp*=tr[rt].s%mod;
temp%=mod;
}
ans+=(temp*n%mod)%mod;
return ;
}
if(tr[rt].same==)
Pushdown(rt);
int L=rt<<,R=rt<<|;
if(l<=tr[L].r)
{
if(r<=tr[L].r)
Query(L,l,r,x);
else
Query(L,l,tr[L].r,x);
}
if(r>=tr[R].l)
{
if(l>=tr[R].l)
Query(R,l,r,x);
else
Query(R,tr[R].l,r,x);
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
{
memset(tr,,sizeof(tr));
build(,,n);
for(int i=;i<m;i++)
{
int x,y,ty,c;
scanf("%d%d%d%d",&ty,&x,&y,&c);
if(ty==)
{
ans=;
Query(,x,y,c);
cout<<ans%mod<<endl;
}
else
{
Update(,x,y,c,ty);
} }
}
return ;
}
kb-07线段树--11--区间多重该值多种查询的更多相关文章
- FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解
题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...
- 刷题向》关于线段树的区间开根号 BZOJ3211(NORMAL+)
这是一道关于线段树的区间开根号的裸题,没什么好讲的. 值得注意的是,因为有区间开根号的性质,所以我们每一次更改操作只能把更改区间所覆盖的所有元素全部查找,当然你直接找效率明显爆炸... 能够注意到,指 ...
- ZOJ 2301 Color the Ball 线段树(区间更新+离散化)
Color the Ball Time Limit: 2 Seconds Memory Limit: 65536 KB There are infinite balls in a line ...
- poj 3468:A Simple Problem with Integers(线段树,区间修改求和)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 58269 ...
- zoj3686(线段树的区间更新)
对线段树的区间更新有了初步的了解... A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a ...
- Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并
D. Developing Game Pavel is going to make a game of his dream. However, he knows that he can't mak ...
- hiho一下20周 线段树的区间修改
线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了 ...
- 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)
原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
随机推荐
- idea存留
1.导师匿名评价系统 类似看准网 2.在线降重软件 基于翻译api,或者后期写算法 在线查重导流 公众号: e搜罗
- overloading and overriding
What is the difference between method overloading and method overriding in Java? Differences between ...
- IDEA设置每次打开重新选择项目
通过这里,选择settings,或者进入之后的FILE->settings.搜索System 即可出现
- ReactiveCocoa概念解释进阶篇
1.ReactiveCocoa常见操作方法介绍 1.1 ReactiveCocoa操作须知 所有的信号(RACSignal)都可以进行操作处理,因为所有操作方法都定义在RACStream.h中,因此只 ...
- 如何用纯 CSS 创作一个极品飞车 loader
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MBbEMo 可交互视频 ...
- LightOj:1422-Halloween Costumes
传送门:http://www.lightoj.com/volume_showproblem.php?problem=1422 Halloween Costumes problem descriptio ...
- hdu 4565
Problem Description A sequence Sn is defined as:Where a, b, n, m are positive integers.┌x┐is the cei ...
- poj 3616 奶牛产奶问题 dp算法
题意:奶牛产奶,农夫有m个时间段可以挤奶,在工作时间 f t 内产奶量为m,每次挤完奶后,奶牛需要休息R.问:怎么安排使得产奶量最大? 思路:区间dp dp[i]表示第i个时段 对农夫工作的结束时间 ...
- Linux和 Mac下git pull/push 免输入密码和账号
linux下面可以直接创建.git-credential文件,命令如下: 创建文件,进入文件,输入内容: cd ~ touch .git-credentials vim .git-credential ...
- HDU 5489 Removed Interval DP 树状数组
题意: 给一个长度为\(N\)的序列,要删除一段长为\(L\)的连续子序列,问所能得到的最长的\(LIS\)的长度. 分析: 设\(f(i)\)表示以\(a_i\)结尾的\(LIS\)的长度,设\(g ...