https://www.luogu.org/blog/Sooke/solution-p5280

首先想到对线段树上每个点分别维护有多少棵线段树在它上有标记(f[]),然后想到对于每个操作,根据转移的不同分成5种点。

为了满足第三类点的转移要求,再维护g[],转移类似分类讨论即可。

最后发现前三类点是$O(\log n)$级别的,后两类点可以通过打标记实现。于是就做完了。

 #include<cstdio>
#include<algorithm>
#define ls (x<<1)
#define rs (ls|1)
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=,mod=;
int n,m,k=,op,l,r,f[N],g[N],tf[N],tg[N],sf[N]; int add(int x,int y){ return x+y>=mod ? x+y-mod : x+y; }
int sub(int x,int y){ return x-y< ? x-y+mod : x-y; } void upd(int x){ sf[x]=add(f[x],add(sf[ls],sf[rs])); }
void pushf(int x,int k){ f[x]=1ll*f[x]*k%mod; tf[x]=1ll*tf[x]*k%mod; sf[x]=1ll*sf[x]*k%mod; }
void pushg(int x,int k){ g[x]=1ll*g[x]*k%mod; tg[x]=1ll*tg[x]*k%mod; } void push(int x){
if (tf[x]!=) pushf(ls,tf[x]),pushf(rs,tf[x]),tf[x]=;
if (tg[x]!=) pushg(ls,tg[x]),pushg(rs,tg[x]),tg[x]=;
} void build(int x,int L,int R){
g[x]=tf[x]=tg[x]=;
if (L==R) return;
int mid=(L+R)>>;
build(ls,L,mid); build(rs,mid+,R);
} void mdf(int x,int L,int R,int l,int r){
push(x);
if (L==l && r==R){ f[x]=add(f[x],k); pushf(ls,); pushf(rs,); upd(x); return; }
int mid=(L+R)>>; g[x]=add(g[x],k);
if (r<=mid){
mdf(ls,L,mid,l,r); push(rs); f[rs]=add(f[rs],sub(k,g[rs])); g[rs]=add(g[rs],g[rs]);
pushf(rs<<,); pushf((rs<<)|,); pushg(rs<<,); pushg((rs<<)|,); upd(rs);
}else if (l>mid){
mdf(rs,mid+,R,l,r); push(ls); f[ls]=add(f[ls],sub(k,g[ls])); g[ls]=add(g[ls],g[ls]);
pushf(ls<<,); pushf((ls<<)|,); pushg(ls<<,); pushg((ls<<)|,); upd(ls);
}else mdf(ls,L,mid,l,mid),mdf(rs,mid+,R,mid+,r);
upd(x);
} int main(){
freopen("segment.in","r",stdin);
freopen("segment.out","w",stdout);
scanf("%d%d",&n,&m); build(,,n);
rep(i,,m){
scanf("%d",&op);
if (op==) scanf("%d%d",&l,&r),mdf(,,n,l,r),k=add(k,k);
else printf("%d\n",sf[]);
}
return ;
}

[Luogu5280][ZJOI2019]线段树(线段树+DP)的更多相关文章

  1. Codeforces Round #278 (Div. 1) Strip (线段树 二分 RMQ DP)

    Strip time limit per test 1 second memory limit per test 256 megabytes input standard input output s ...

  2. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  3. Codeforce 101B. Buses(线段树or树状数组+离散化)

     Buses                                                                                               ...

  4. HDU 5877 dfs+ 线段树(或+树状树组)

    1.HDU 5877  Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...

  5. 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))

    函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...

  6. BZOJ_3196_二逼平衡树_(树套树,线段树+Treap)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3196 可以处理区间问题的平衡树. 3196: Tyvj 1730 二逼平衡树 Time Lim ...

  7. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  8. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  9. 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665

    如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...

  10. HDOJ 4417 - Super Mario 线段树or树状数组离线处理..

    题意: 同上 题解: 抓着这题作死的搞~~是因为今天练习赛的一道题.SPOJ KQUERY.直到我用最后一种树状数组通过了HDOJ这题后..交SPOJ的才没超时..看排名...时间能排到11名了..有 ...

随机推荐

  1. 如何选题?| 什么样的科学问题 | 研究项目才是有意义的?| scientific method

    搞科研,尤其是生命科学,经常会觉得自己做的东西是坨屎,没有任何意义. 在硕博的时候这种感觉会非常强烈,一个是自己思考能力不足:二是你的项目不是你设计的,不懂个中缘由,只执行的话就会很无聊,找不到意义感 ...

  2. python gtk 环境

    为Python添加GTK+库:pygtk(windows下安装pygtk) 一.下载需要的文件 昨天晚上就是所需的文件没有找全,我还以为只需要一个pygtk就够了. 1.下载pygtk需要的文件 到p ...

  3. exp/imp 注释乱码问题或Oracle EXP-00091的解决方法

    今天用imp 导入后,发现中注释乱码,源端.目的端数据库版本都是11.2.0.1 查看源端字符集: SQL> select userenv('language') from dual;USERE ...

  4. post请求头中常见content-type(非常重要)

    定义和用法 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码.默认地,表单数据会编码为 "application/x-www-form-urlencoded". ...

  5. Tomcat 8.5.x RedisSessionManager show:Caused by: java.lang.NoSuchMethodError: com.crimsonhexagon.rsm.

    Caused by: java.lang.NoSuchMethodError: com.crimsonhexagon.rsm.RedisSessionManager.getMaxInactiveInt ...

  6. springboot+jwt完成登录认证

    本demo用于测试jwt,通过登录验证通过后,使用jwt生成token,然后在请求header中携带token完成访问用户列表信息. 准备工作: 1. 实体类SysUser.java package ...

  7. Java基础 return 退出main方法的示例

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  8. typeScript模块<一>

    /*模块 模块的的概念 模块导出的几种方法 1.export 导出声明 2.export 导出语句 3.export default 4.import导入模块 模块化封装上一讲的DB库 */ /* 模 ...

  9. pytorch求范数函数——torch.norm

    torch.norm(input, p='fro', dim=None, keepdim=False, out=None, dtype=None) 返回所给tensor的矩阵范数或向量范数 参数: i ...

  10. evo:评测slam参数设置

    zn@buaa:~$ evo_ape euroc m1/state_groundtruth_estimate0/data.csv pl-svo-master2/trajout.txt -angle_d ...