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 ...
随机推荐
- BZOJ 1396:识别子串 SA+树状数组+单调队列
1396: 识别子串 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 381 Solved: 243[Submit][Status][Discuss] ...
- MovieReview—Black Panther(黑豹)
Justice & Evil The night before the night, i saw the latest movie in the Marvel series at JiaH ...
- 如何使用Python生成200个优惠券(激活码)
解析: 常见的优惠券(激活码)是由数字.字母(大小写)组成: string.ascii_letters 26个大小写字母: string.digits 0-9数字: 随机组合 使用random.s ...
- ubuntu开放端口
1.安装iptables(一般情况,ubuntu安装好的时候,iptables会被安装上),使用以下命令: $apt-get update $apt-get install iptables 2.安装 ...
- 使用FileSystemWatcher组件监视日志文件
实现效果: 知识运用: FileSystemWatcher组件的Path属性 Filter属性 //要监视那些文件 默认为*.* Endinit方法 //结束在窗体上使用或有另一个组件使用的Fil ...
- linux文本处理工具及正则表达式
cat命令:查看文本内容 cat [选项]... [文件]... -E 显示行结束符 -n 显示文本内容时显示行号 -A 显示所以控制符 -b 非空行编号 -s 压缩连 ...
- java基础—this关键字
一.this关键字
- on() 和 click() 的区别
on() 和 click() 的区别: 二者在绑定静态控件时没有区别,但是如果面对动态产生的控件,只有 on() 能成功的绑定到动态控件中. 以下实例中原先的 HTML 元素点击其身后的 Delete ...
- tempfs详解
致因 在平常工作中,我们经常需要查看Linux服务器磁盘挂载使用情况,可以使用df命令,不知大家注意到没有,我们使用此命令除了会查看到系统盘以及数据盘挂载情况,还会看到一个tmpfs也在挂载. [ro ...
- ASP( VBScript ) 解析 JSON
<script language="jscript" runat="server"> Array.prototype.get = function( ...