首先想到线段树,然后刚开始写忽然想到树状数组求和岂不是更快,而且编程复杂度又小,于是把之前写的删掉,写树状数组,写完模版之后忽然发现这题竟然是区间修改!

于是又删掉重写,忽然发现不会处理又加又乘的,果断看题解……

经过几乎两个小时的调试,终于1A。

需要注意的是,一定要让线段树的每一个区间保存的值时刻为正确的,这样才能在调用时直接返回。比如说这道题的change和query操作的最后一句话:

sum:=f(g[k<<1]+g[k<<1+1])

而不是

sum:=f(t[k<<1].sum+t[k<<1+1].sum)

时刻记住这点就ok了。一开始我还以为我的模版记错了呢……

代码:

 type node=record
l,r,ti,ad,sum:int64;
end;
var i,n,m,tagtime,tagadd,ch,x,y,c,p:longint;
t:array[..] of node;
function f(x:int64):int64;
begin
f:=x mod p;
end;
function g(k:longint):longint;
begin
with t[k] do
begin
g:=f(f(sum*ti)+f(ad*(r-l+)));
end;
end;
procedure build(x,y,k:longint);
var mid:longint;
begin
with t[k] do
begin
l:=x;r:=y;ad:=;ti:=;
if l=r then begin read(sum);sum:=f(sum);exit;end;
mid:=(l+r)>>;
build(l,mid,k<<);
build(mid+,r,k<<+);
sum:=f(t[k<<].sum+t[k<<+].sum);
end;
end;
procedure pushdown(k:longint);
begin
with t[k] do
begin
if ti<> then
begin
sum:=f(sum*ti);
t[k<<].ti:=f(t[k<<].ti*ti);
t[k<<].ad:=f(t[k<<].ad*ti);
t[k<<+].ti:=f(t[k<<+].ti*ti);
t[k<<+].ad:=f(t[k<<+].ad*ti);
ti:=;
end;
if ad<> then
begin
sum:=f(sum+ad*(r-l+));
t[k<<].ad:=f(t[k<<].ad+ad);
t[k<<+].ad:=f(t[k<<+].ad+ad);
ad:=;
end;
end;
end;
procedure change(x,y,k:longint);
var mid:longint;
begin
with t[k] do
begin
if (l=x) and (r=y) then
begin
ti:=(ti*tagtime) mod p;
ad:=(ad*tagtime+tagadd) mod p;
exit;
end;
pushdown(k);
mid:=(l+r)>>;
if y<=mid then change(x,y,k<<)
else if x>mid then change(x,y,k<<+)
else
begin
change(x,mid,k<<);
change(mid+,y,k<<+);
end;
sum:=f(g(k<<)+g(k<<+));
end;
end;
function query(x,y,k:longint):longint;
var mid:longint;
begin
with t[k] do
begin
pushdown(k);
if (l=x) and (r=y) then exit(f(sum));
mid:=(l+r)>>;
if y<=mid then query:=f(query(x,y,k<<))
else if x>mid then query:=f(query(x,y,k<<+))
else query:=f(f(query(x,mid,k<<))+f(query(mid+,y,k<<+)));
sum:=f(g(k<<)+g(k<<+));
end;
end;
procedure init;
begin
readln(n,p);
build(,n,);
end;
procedure main;
begin
readln(m);
for i:= to m do
begin
read(ch);
if ch= then
begin
readln(x,y,tagtime);
tagadd:=;
change(x,y,);
end
else if ch= then
begin
readln(x,y,tagadd);
tagtime:=;
change(x,y,);
end
else
begin
readln(x,y);
writeln(query(x,y,));
end;
end;
end;
begin
init;
main;
end.

虽然现在已经12:30了,但我感觉,很开心。做了这道题,值!

bzoj1789 AHOI 维护数列(线段树)的更多相关文章

  1. [AHOI2009]维护序列 (线段树)

    题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...

  2. [P2023][AHOI2009]维护序列(线段树)

    题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...

  3. BZOJ1798[Ahoi2009]维护序列——线段树

    题目描述     老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成.    有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

  4. 【AHOI2009】 维护序列 - 线段树

    题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...

  5. Codeforces 446C - DZY Loves Fibonacci Numbers(斐波那契数列+线段树)

    Codeforces 题目传送门 & 洛谷题目传送门 你可能会疑惑我为什么要写 *2400 的题的题解 首先一个很明显的想法是,看到斐波那契数列和 \(10^9+9\) 就想到通项公式,\(F ...

  6. BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)

    BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...

  7. BZOJ 1798 AHOI2009 Seq 维护序列 线段树

    题目大意:维护一个序列,提供三种操作: 1.将区间中每个点的权值乘上一个数 2.将区间中每个点的权值加上一个数 3.求一段区间的和对p取模的值 2631的超^n级弱化版.写2631之前能够拿这个练练手 ...

  8. P3703 [SDOI2017]树点涂色 LCT维护颜色+线段树维护dfs序+倍增LCA

    \(\color{#0066ff}{ 题目描述 }\) Bob有一棵\(n\)个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点 ...

  9. P1438 无聊的数列 (线段树)

    题目链接 Solution 直接维护一个差分的线段树就好了. 其中线段树的节点代表 \(r\) 比 \(l\) 多多少. Code #include<bits/stdc++.h> #def ...

随机推荐

  1. Spark Streaming揭秘 Day19 架构设计和运行机制

    Spark Streaming揭秘 Day19 架构设计和运行机制 今天主要讨论一些SparkStreaming设计的关键点,也算做个小结. DStream设计 首先我们可以进行一个简单的理解:DSt ...

  2. 1076. Forwards on Weibo (30)

    时间限制 3000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Weibo is known as the Chinese v ...

  3. WinForm调试输出数据

    在调试Winfrom时想知道其中的数据输出 1.单击运行按钮 2.选择调试->窗口->输出 3.单击Winform中要执行的按钮  在输出栏中显示输出数据 4.Ctrl  K  S  能够 ...

  4. 【ASP.NET】TreeView控件学习

    相关链接 : http://www.cnblogs.com/yc-755909659/p/3596039.html

  5. Contest2037 - CSU Monthly 2013 Oct (problem D :CX and girls)

    [题解]: 最短路径问题,保证距离最短的同时,学妹权值最大,哈哈 [code]: #include<iostream> #include<queue> #include< ...

  6. 1003: [ZJOI2006]物流运输trans - BZOJ

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...

  7. aJax提交——服务端不能用request存储数据,session存数据客户端可以接收到

    aJax提交与普通提交是两种迥异的提交方式,这两种提交方式决定了客户端与服务端交互时存储.传输数据的方式也不同. aJax提交,客户端的请求数据存储在data中,服务端用request.getPara ...

  8. BZOJ 3160 万径人踪灭 解题报告

    这个题感觉很神呀.将 FFT 和 Manacher 有机结合在了一起. 首先我们不管那个 “不能连续” 的条件,那么我们就可以求出有多少对字母关于某一条直线对称,然后记 $T_i$ 为关于直线 $i$ ...

  9. myeclipse报错:Could not create the view: An unexpected exception was thrown.

    打开server窗口,发现显示:Could not create the view: An unexpected exception was thrown. 此处解决方法: 关闭myeclipse 删 ...

  10. MVC 自定义AuthorizeAttribute 实现权限验证

    MVC内置的AuthorizeFilter先于Action/Result过滤器执行,为网站权限验证提供了很好的一套验证机制. 通过自定义的AuthorizeAttribute可以实现对用户权限的验证. ...