[Luogu5280][ZJOI2019]线段树(线段树+DP)
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)的更多相关文章
- 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 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- Codeforce 101B. Buses(线段树or树状数组+离散化)
Buses ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...
- BZOJ_3196_二逼平衡树_(树套树,线段树+Treap)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3196 可以处理区间问题的平衡树. 3196: Tyvj 1730 二逼平衡树 Time Lim ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- HDOJ 4417 - Super Mario 线段树or树状数组离线处理..
题意: 同上 题解: 抓着这题作死的搞~~是因为今天练习赛的一道题.SPOJ KQUERY.直到我用最后一种树状数组通过了HDOJ这题后..交SPOJ的才没超时..看排名...时间能排到11名了..有 ...
随机推荐
- win10安装Navicat 12 for MySQL
Navicat 下载地址: https://blog.csdn.net/u013600314/article/details/80605981 Navicat 连接Mysql 的方法:https:// ...
- DevOps Scrum Agile Tech Debt
从实践中长出的 DevOps 大树 - 服务管理 - CIO时代—新技术.新商业.新管理http://www.hunnatv.com/glfw/145411.html Nexus规模化Scrum框架h ...
- Python不带参数的类装饰器
# -*- coding: utf-8 -*- # author:baoshan # 不带参数的类装饰器 # 类装饰器的实现,必须实现__call__和__init__两个内置函数. # __init ...
- scipy详解
登月图片消噪 scipy.fftpack模块用来计算快速傅里叶变换速度比传统傅里叶变换更快,是对之前算法的改进图片是二维数据,注意使用fftpack的二维转变方法 import numpy a ...
- Spring mvc4 + ActiveMQ 整合【什么框架与什么框架的整合搜索】
一.配置部分 二.代码部分 三.页面部分 四.Controller控制器 五.效果展示 六.加入监听器 七.最最重要的,别忘了打赏 一.配置部分 ActiveMQ的安装这就不说了,很简单, 这个例子采 ...
- 异常检测-基于孤立森林算法Isolation-based Anomaly Detection-1-论文学习
论文http://202.119.32.195/cache/10/03/cs.nju.edu.cn/da2d9bef3c4fd7d2d8c33947231d9708/tkdd11.pdf 1. INT ...
- ros 学习 array 的添加
array的添加,使用 arry[i]赋值时会出现段错误,需要使用array.push_back添加到数据中,在ros中array数组是以vector方式存储的. 例如: 包含数组的msg定义为: h ...
- mybatis typeHandler类型转换器
typeHandler类型转换器 在JDBC中,需要在PreparedStatement对象中设置那些已经预编译过的SQL语句的参数.执行SQL后,会通过ResultSet对象获取得到数据库的数据,而 ...
- Delphi 调用控件的过程,初学者都想知道
假设有过程: procedure TForm1.Button1Click(Sender: TObject);begin ShowMessage('唐细刚 2008');end; 想在 FormC ...
- LODOP打印超文本字符串拼接2 单选选择css样式表格
之前的相关字符串拼接的博文:LODOP打印超文本字符串拼接1 固定表格填充数值之前博文介绍过,字符串可以随意拼接,只要最后组织成的字符串是自己需要的超文本就可以了,前面还有一篇也是拼接样式的:Lodo ...