值得一做》关于双标记线段树两三事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/ ...
随机推荐
- 剑指offer-第七章面试案例2(树中两个节点的公共祖先节点)
import java.util.LinkedList; import java.util.Queue; import java.util.Stack; //树中两个节点的最低公共祖先 //第一种情况 ...
- 洛谷 P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver
传送门 题目大意: n个谷仓 ,每次关闭一个谷仓,问剩下没被关闭的谷仓是 否联通. 题解:并查集+倒序处理 代码: #include<iostream> #include<cstdi ...
- 设置ubantu的软件源地址
查看所用的源 $ sudo vim /etc/apt/sources.list 由于安装的Ubuntu Server 16.04.1 LTS是英文版的,软件源就默认都是 us.archive.ubun ...
- numpy之初探排序和集合运算
排序 排序 numpy与python列表内置的方法类似,也可通过sort方法进行排序. 用法如下: In [1]: import numpy as np In [2]: x = np.random.r ...
- asp+jquery+ajax,asp后台程序执行不正常
项目中前台页面通过jquery .ajax功能将关键数据传递到后台并写入数据库,调试中发现后台程序一直没有正常执行,后反复排查 发现asp程序中不能包含#include file语句
- quartz框架实现定时任务举例
简单的定时任务功能可以通过原生的java.util.Timer定义执行时间规则.继承java.util.TimeTask来定义执行逻辑来实现,更方便的是利用开源的quartz框架,只需定义几个spri ...
- Linux 简单按键中断处理流程
中断处理程序中不能延时.休眠之类的,一定要最快速.高效的执行完. // 功能:申请中断 // 参数1:中断号码,通过宏 IRA_EINT(x) 获取 // 参数2:中断的处理函数,填函数名 // 参数 ...
- Sqlite数据库中的事务
public void testTrasaction() throws Exception{ PersonSQLiteOpenHelper helper = new PersonSQLiteOpen ...
- 1032 Sharing
题意:寻找两个链表的首个公共结点,输出其地址. 思路: 方法1. 如果LinkList1比LinkList2长,则让LinkList1先偏移(len1-len2)个结点,然后,让两个链表的的工作指针 ...
- android选中radiobutton后改变TextColor
首先,看下效果图,以护照为例 然后选中护照后 可以看到 字体由黑色变成了白色 下面说下实现方法. 首先 在values文件夹下的color.xml文件中加入<drawable/>标签的颜色 ...