题目分析:

这题除了分类讨论就没啥了。。。

容易发现问题实际就是所有操作选和不选按顺序执行的所有答案和。考虑每个点在多少种情况下会有tag。

那么,考虑新插入一个[l,r],所有有交集的点都会被清空,所以这些点答案不变。

然后考虑有交集的点中间[l',r']是子集关系的点,这些点答案并不是不变,而是答案加了$2^{cnt-1}$,$cnt$为已执行的1操作数。

然后没被遍历到的点答案*2.

然后遍历到的点中间没有任何交集的点,答案数加的就是前面的操作方案中他到根的路径中间有tag的这个点的数量。

这个我们再建一个线段树,然后分类讨论。

对于扫到的终点和它下面的点,答案加上$2^{cnt-1}$,对于经过的有交集的点,答案不变。对于剩下遍历到的点和没遍历到的点,答案*2。

这是因为tag会往下传,不会影响其它的答案。

以上用lazytag实现

代码:

 #include<bits/stdc++.h>
using namespace std; const int mod = ;
const int maxn = ; int n,m,cnt; int T1[maxn<<],D1[maxn<<],lazy1[maxn<<];
int D2[maxn<<],M2[maxn<<],A2[maxn<<];
int pw2[maxn]; void push_down(int now){
T1[now<<]=1ll*T1[now<<]*lazy1[now]%mod;
T1[now<<|]=1ll*T1[now<<|]*lazy1[now]%mod;
D1[now<<]=1ll*D1[now<<]*lazy1[now]%mod;
D1[now<<|]=1ll*D1[now<<|]*lazy1[now]%mod;
lazy1[now<<] = 1ll*lazy1[now<<]*lazy1[now]%mod;
lazy1[now<<|] = 1ll*lazy1[now<<|]*lazy1[now]%mod;
lazy1[now] = ;
} void modify1(int now,int tl,int tr,int l,int r){
if(tl > r || tr < l){
T1[now]*=;T1[now]%=mod; //D1[now]*=2;D1[now]%=mod;
T1[now] -= D1[now]; T1[now] += mod; T1[now] %= mod;
lazy1[now] *= ; lazy1[now] %= mod;
return;
}
if(tl >= l && tr <= r){
T1[now] = ((2ll*T1[now]%mod-D1[now]+mod)%mod+pw2[cnt-])%mod;
D1[now] = (D1[now]+pw2[cnt-])%mod;
lazy1[now] = 2ll*lazy1[now]%mod;
return;
}
if(lazy1[now]!=) push_down(now);
int mid = (tl+tr)/;
modify1(now<<,tl,mid,l,r); modify1(now<<|,mid+,tr,l,r);
T1[now] = (1ll*T1[now<<]+T1[now<<|]+D1[now])%mod;
} void pdm(int now){
D2[now<<] = 1ll*M2[now]*D2[now<<]%mod;
D2[now<<|] = 1ll*M2[now]*D2[now<<|]%mod;
M2[now<<] = 1ll*M2[now<<]*M2[now]%mod;
M2[now<<|] = 1ll*M2[now<<|]*M2[now]%mod;
A2[now<<] = 1ll*A2[now<<]*M2[now]%mod;
A2[now<<|] = 1ll*A2[now<<|]*M2[now]%mod;
M2[now] = ;
} void pda(int now){
D2[now<<] = (D2[now<<]+A2[now])%mod;
D2[now<<|] = (D2[now<<|]+A2[now])%mod;
A2[now<<] = (A2[now<<]+A2[now])%mod;
A2[now<<|] = (A2[now<<|]+A2[now])%mod;
A2[now] = ;
} stack<int> sta;
void add1(int now,int dt){
int pp = now;
while(pp){sta.push(pp); pp >>= ;}
while(!sta.empty()){
if(lazy1[sta.top()]) push_down(sta.top());
T1[sta.top()] += dt; T1[sta.top()] %= mod;
sta.pop();
}
D1[now] += dt; D1[now] %= mod;
} void modify2(int now,int tl,int tr,int l,int r){
if(tl > r || tr < l){
add1(now,D2[now]);D2[now] *=; D2[now] %= mod;
M2[now] = M2[now]*%mod; A2[now] = A2[now]*%mod;
return;
}
if(tl >= l && tr <= r){
D2[now] += pw2[cnt-]; D2[now] %= mod;
A2[now]+=pw2[cnt-];A2[now]%=mod;return;
}
if(M2[now] != ) pdm(now);
if(A2[now]) pda(now);
int mid = (tl+tr)/;
modify2(now<<,tl,mid,l,r);
modify2(now<<|,mid+,tr,l,r);
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=*n;i++) lazy1[i] = ,M2[i] = ;
pw2[] = ;
for(int i=;i<=m;i++) pw2[i] = *pw2[i-]%mod;
for(int i=;i<=m;i++){
int cas; scanf("%d",&cas);
if(cas == ){printf("%d\n",T1[]);}
else{
int l,r; scanf("%d%d",&l,&r);
cnt++;
modify1(,,n,l,r);
modify2(,,n,l,r);
}
}
}

Luogu5280 [ZJOI2019] 线段树 【线段树】的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. hdu 4836 The Query on the Tree(线段树or树状数组)

    The Query on the Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  9. 【BZOJ3295】动态逆序对(线段树,树状数组)

    [BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...

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

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

随机推荐

  1. NPAPI绘图和事件处理

    https://developer.mozilla.org/en-US/docs/Plugins/Guide/Drawing_and_Event_Handling 本章介绍如何确定插件实例是窗口化还是 ...

  2. useState 的介绍和多状态声明(二)

    useState的介绍 useState是react自带的一个hook函数,它的作用是用来声明状态变量. 那我们从三个方面来看useState的用法,分别是声明.读取.使用(修改).这三个方面掌握了, ...

  3. java 判断list是否为空

    问题: 之前用 list!=null 来判断list是否为空,但发现,定义一个list后,即使里面并没有加入任何元素,返回的结果仍旧是 true, 其实,本意是希望在没有任何元素时,返回 false, ...

  4. Python 3.8.0 final¶ Release date: 2019-10-14

    https://docs.python.org/3.8/whatsnew/changelog.html#python-3-8-0 Core and Builtins bpo-38469: Fixed ...

  5. ActiveMQ持久化

    ActiveMQ中,持久化是值对消息数据的持久化.在ActiveMQ中,默认的消息是保存在内存中的.当内存容量不足的时候,或ActiveMQ正常关闭的时候,会将内存中的未处理的消息持久化到磁盘中.具体 ...

  6. Python 23种设计模式全(python例子)

    从今年5月份开始打算把设计模式都写到博客里,持续到现在总算是写完了.写的很慢,好歹算是有始有终.对这些设计模式有些理解的不准确,有些甚至可能是错的,请看到的同学拍砖留言.内容来源很杂,大部分参考或者摘 ...

  7. AndoridSQLite数据库开发基础教程(9)

    AndoridSQLite数据库开发基础教程(9) 添加视图 视图是从一个或几个基本表(或视图)中导出的虚拟的表.通过视图可以看到表的内容.下面为数据库添加视图,操作步骤如下: (1)打开的数据库,单 ...

  8. (转)golang获取当前时间、时间戳和时间字符串及它们之间的相互转换

    原文连接: https://blog.csdn.net/skh2015java/article/details/70051512 1.获取当前时间 currentTime:=time.Now() // ...

  9. 【Python】使用POST方式抓取有道翻译结果

    1.安装requests库 2.打开有道翻译,按下F12,进入开发者模式,输入我爱青青,点击Network,再点击XHR 3.撰写爬虫 import requestsimport json # 使用有 ...

  10. Qt连接数据库

    Qt连接数据库,参数设置 //连接数据库 bool VCManageDatabase::connectMYSQL() { //判断testConnect连接是否存在并连接 if (QSqlDataba ...