值得一做》关于双标记线段树两三事BZOJ 1798 (NORMAL-)
这是一道双标记线段树的题,很让人很好的预习/学习/复习线段树,我不知道它能让别人学习什么,反正让我对线段树的了解更加深刻。
题目没什么好讲的,程序也没什么好讲的,所以也没有什么题解,但是值得一做
给出题目&代码
Description
Input
Output
Sample Input
1 2 3 4 5 6 7
5
1 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7
Sample Output
35
8
HINT
【样例说明】
初始时数列为(1,2,3,4,5,6,7)。
经过第1次操作后,数列为(1,10,15,20,25,6,7)。
对第2次操作,和为10+15+20=45,模43的结果是2。
经过第3次操作后,数列为(1,10,24,29,34,15,16}
对第4次操作,和为1+10+24=35,模43的结果是35。
对第5次操作,和为29+34+15+16=94,模43的结果是8。
测试数据规模如下表所示
数据编号 1 2 3 4 5 6 7 8 9 10
N= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000
M= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000
/**************************************************************
Problem: 1798
User: PencilWang
Language: C++
Result: Accepted
Time:4320 ms
Memory:27388 kb
****************************************************************/ #include<stdio.h>
long long n,m;
long long MOD;
struct shit{
int L,R;
long long num,j,c;
}s[];
long long w[];
long long C,J;
void fuck(int p)
{
s[p].num=(s[p<<].num+s[p<<|].num)%MOD;
return ;
}
void suck(int p)
{
int mid=(s[p].L+s[p].R)>>;
int LL=p<<,RR=p<<|;
s[LL].num=(s[LL].num*s[p].c+(s[LL].R-s[LL].L+)*s[p].j)%MOD;
s[LL].c=(s[LL].c*s[p].c)%MOD;
s[LL].j=(s[LL].j*s[p].c+s[p].j)%MOD;
s[RR].num=(s[RR].num*s[p].c+(s[RR].R-s[RR].L+)*s[p].j)%MOD;
s[RR].c=(s[RR].c*s[p].c)%MOD;
s[RR].j=(s[RR].j*s[p].c+s[p].j)%MOD;
s[p].c=,s[p].j=;
return ;
}
void build(int p,int l,int r)
{
s[p].L=l;
s[p].R=r;
s[p].c=;
s[p].j=;
if(l==r)
{
s[p].num=w[l];
return ;
}
int mid=(l+r)>>;
build(p<<,l,mid);
build(p<<|,mid+,r);
fuck(p);
return ;
}
void cc(int a,int b,int x,int p)
{
if(a<=s[p].L&&s[p].R<=b)
{
s[p].num=(x*s[p].num)%MOD;
s[p].c=(x*s[p].c)%MOD;
s[p].j=(x*s[p].j)%MOD;
return ;
}
suck(p);
int mid=(s[p].L+s[p].R)>>;
if(mid>=a)cc(a,b,x,p<<);
if(mid<b)cc(a,b,x,p<<|);
fuck(p);
return ;
}
void jj(int a,int b,int x,int p)
{
if(a<=s[p].L&&s[p].R<=b)
{
s[p].num=(s[p].num+x*(s[p].R-s[p].L+))%MOD;
s[p].j=(x+s[p].j)%MOD;
return ;
}
suck(p);
int mid=(s[p].L+s[p].R)>>;
if(mid>=a)jj(a,b,x,p<<);
if(mid<b)jj(a,b,x,p<<|);
fuck(p);
return ;
}
long long Q(int p,int a,int b)
{
if(a<=s[p].L&&s[p].R<=b)
return s[p].num%MOD;
int mid=(s[p].L+s[p].R)>>;
suck(p);
long long ANS=;
if(a<=mid)
{
ANS+=Q(p<<,a,b);
ANS%=MOD;
}
if(b>mid)
{
ANS+=Q(p<<|,a,b);
ANS%=MOD;
}
fuck(p);
return ANS;
}
int main()
{
long long a,b,c,f;
scanf("%lld%lld",&n,&MOD);
for(int i=;i<=n;i++)scanf("%lld",w+i);
build(,,n);
scanf("%lld",&m);
while(m--)
{
scanf("%lld%lld%lld",&f,&a,&b);
if(f==)
{
scanf("%lld",&c);
c%=MOD;
cc(a,b,c,);
}
else if(f==)
{
scanf("%lld",&c);
c%=MOD;
jj(a,b,c,);
}
else
printf("%lld\n",Q(,a,b)%MOD);
}
return ;
}
1798
值得一做》关于双标记线段树两三事BZOJ 1798 (NORMAL-)的更多相关文章
- [cogs2638]数列操作ψ(双标记线段树)
题目大意:给定一个数列a,你需要支持的操作:区间and,区间or,询问区间最大值 解题关键: 1.双标记线段树,注意优先级(超时) 当涉及多重标记时,定义出标记的优先级,修改操作时用优先级高(先下放) ...
- 【双标记线段树】bzoj1798维护序列seq
一.题目 描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列 ...
- 数据结构(线段树):BZOJ 3126: [Usaco2013 Open]Photo
3126: [Usaco2013 Open]Photo Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 222 Solved: 116 Descrip ...
- 线段树合并 || BZOJ 5457: 城市
题面:https://www.lydsy.com/JudgeOnline/problem.php?id=5457 题解: 线段树合并,对于每个节点维护sum(以该节点为根的子树中最大的种类和)和kin ...
- 【线段树】BZOJ 5334 数学计算
题目内容 小豆现在有一个数\(x\),初始值为\(1\).小豆有\(Q\)次操作,操作有两种类型: 1 m:\(x=x×m\),输出\(x\ mod\ M\): 2 pos:\(x=x/\)第\(po ...
- bzoj 维护序列seq(双标记线段树)
Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 4184 Solved: 1518[Submit][Status][Discus ...
- 主席树 || 可持久化线段树 || LCA || BZOJ 2588: Spoj 10628. Count on a tree || Luogu P2633 Count on a tree
题面: Count on a tree 题解: 主席树维护每个节点到根节点的权值出现次数,大体和主席树典型做法差不多,对于询问(X,Y),答案要计算ans(X)+ans(Y)-ans(LCA(X,Y) ...
- 数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2638 Solved: 864 Descri ...
- BZOJ_1798_&_Codevs_2216_[AHOI_2009]_行星序列_(线段树)
描述 BZOJ: http://www.lydsy.com/JudgeOnline/problem.php?id=1798 Codevs: http://codevs.cn/problem/2216/ ...
随机推荐
- ng 实现插入和删除
结果: 代码: <!DOCTYPE html> <html ng-app="myApp"> <head lang="en"> ...
- golang:bson.ObjectId与string转化
网上资料不好搜,记下来:两个变量:id bson.ObjectIdstr string bson.ObjectId—>string id.Hex() string—>bson.Object ...
- 在CodeBlocks上配置OpenGL问题
问题:出现No such file or directory.之后重建了C++project 仍然出现这个error.嘿 奇了怪了! 原因:前几日写密码学作业,用到NTL库,将编译器路径设置为NTL库 ...
- hibernate缓存机制详解
hiberante面试题—hibernate缓存机制详解 这是面试中经常问到的一个问题,可以按照我的思路回答,准你回答得很完美.首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再 ...
- win7下破解无线网密码
很多朋友喜欢做一些比较有成就感的事情,例如破解别人的密码,现在破解的方式大部分还是以跑字典这种没有任何技术含量的手段进行,那么破解的成功与否就和我们的字典有很多的关系了,本次经验就来教大家怎样进行字典 ...
- linux之 crontab 定时任务
crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查 ...
- BZOJ3790:神奇项链
浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html 题目传送门:https://lydsy.com/JudgeOnline/pro ...
- C# messagebox 居中父窗体
在右边项目上点击右键->Add->class,添加MessageBoxEx类: using System; using System.Windows.Forms; using System ...
- CAN总线扩展数据帧介绍
在扩展CAN 数据帧中,紧随SOF 位的是32 位的仲裁字段.仲裁字段的前11 位为29 位标识符的最高有效位(Most Significant bit,MSb)(基本lD) .紧随这11 位的是替代 ...
- 自定义第三方YUM源
1.切换到cloudboot系统目录中 2.拷贝repodata目录的*-repo.xml文件到系统目录下 3.删除系统目录的repodata目录 4.编辑repo.xml内容,base添加rpm包包 ...