P5111 zhtobu3232的线段树
维护左子树右子树的贡献和跨区间贡献
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn=10000000;
const LL inf=2147483646;
const LL MOD=998244353;
#define md(x) (x=(x>MOD)?x-MOD:x)
#define ctwo(x) ((x*(x-1)/2+x)%MOD)
#define dec(x) (x=x?x-1:MOD-1)
#define inc(x) (x=(x==MOD-1)?0:x+1)
inline LL Read(){
LL x=0,f=1; char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}return x*f;
}
struct node{
LL son[2],pre,suf,ans,flag;
}tree[maxn];
LL n,m,nod,root;
inline void mg(node& now,const node& son0,const node& son1){
now.pre=son0.pre+son0.flag*son1.pre;
md(now.pre);
now.suf=son1.suf+son1.flag*son0.suf;
md(now.suf);
now.ans=(son0.ans+son1.ans+son0.suf*son1.pre)%MOD;
if(now.flag){
if(!(son0.flag&&son1.flag))
inc(now.pre),
inc(now.suf),
inc(now.ans);
}
else if(son0.flag&&son1.flag)
dec(now.pre),
dec(now.suf),
dec(now.ans);
}
inline void Update(LL now,LL son0,LL son1,LL len1,LL len2){
if(len1==0){
tree[now].flag=tree[now].pre=tree[now].suf=tree[now].ans=0;
return;
}
node c1,c2;
if(son0)
c1=tree[son0];
else{
len1=len1%MOD,
c1.ans=ctwo(len1),
c1.pre=len1,
c1.suf=len1,
c1.flag=1;
}
if(son1)
c2=tree[son1];
else{
len2=len2%MOD,
c2.ans=ctwo(len2),
c2.pre=len2,
c2.suf=len2,
c2.flag=1;
}
mg(tree[now],c1,c2);
}
inline void Change(LL now,LL l,LL r,LL lt,LL rt){
if(lt==l&&rt==r){
tree[now].flag=0,
Update(now,tree[now].son[0],tree[now].son[1],(r-l)>>1,(r-l+1)>>1);
return;
}
LL mid=(l+r)>>1;
if(mid>lt){
if(!tree[now].son[0]){
tree[now].son[0]=++nod;
LL len=(mid-l)%MOD,son0=nod;
tree[son0].ans=ctwo(len),
tree[son0].pre=len,
tree[son0].suf=len,
tree[son0].flag=1;
}
Change(tree[now].son[0],l,mid,lt,min(rt,mid));
}
if(mid<rt){
if(!tree[now].son[1]){
tree[now].son[1]=++nod;
LL len=(r-mid)%MOD,son1=nod;
tree[son1].ans=ctwo(len),
tree[son1].pre=len,
tree[son1].suf=len,
tree[son1].flag=1;
}
Change(tree[now].son[1],mid,r,max(lt,mid),rt);
}
Update(now,tree[now].son[0],tree[now].son[1],mid-l,r-mid);
}
int main(){
n=Read(),m=Read();
LL len=n%MOD;
root=nod=1,
tree[root].ans=ctwo(len),
tree[root].pre=len,
tree[root].suf=len,
tree[root].flag=1;
while(m--){
LL l=Read(),r=Read();
Change(root,0,n,l-1,r);
}
printf("%lld",tree[root].ans);
return 0;
}
P5111 zhtobu3232的线段树的更多相关文章
- 洛谷P5111 zhtobu3232的线段树
题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
随机推荐
- GIS可视化——热点格网图
一.简介 原理:按照格网大小将区域进行划分,由一个矩形格网替代当前范围内的数据,由格网中心数字代替格网的权重(可以为格网中数据的数量,数据某权重的平均值.最大值.最小值等), 由格网之间颜色的不同表达 ...
- Spark sql读取数据库和ES数据进行处理代码
读取数据库数据和ElasticSearch数据进行连接处理 import java.util.HashMap; import java.util.List; import java.util.Map; ...
- 性能测试脚本开发(C&C#&Java)
一.C语言实现及相关问题解决 LR:C函数-功能描述 LR:C函数-适用范围 LR:C函数-头信息传递 LR:C函数-字符串编码转换 lr_convert_string_encoding(" ...
- MySqlDataReader
本文讲述如何从SqlDataReader或MySqlDataReader中循环读取内容并输出 sqlserver和mysql的DataReader的用法完全一样,只是名字不同,以mysql为例 str ...
- Oracle中Hint深入理解(原创)
http://czmmiao.iteye.com/blog/1478465 Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明 ...
- c#中使用ABCpdf处理PDF,so easy
QQ交流群:276874828 (ABCpdf ) 这几天项目中需要将页面导成PDF,刚开始使用iTextSharp,觉得在分页处理上比较复杂,后来无意中看到了ABCpdf,使用非常简单,并将一些常 ...
- Cocostudio学习笔记(5) Text + TextAtlas + TextBMFont
下午一群大学生到我们公司參观学习,搞得我好紧张.于是滔滔不绝的给他们介绍了怎样开发一款游戏... 今晚研究的控件就是三个label:Text,TextAtlas,TextBMFont 我先在cocos ...
- cmake学习之-configure_file
一.系统版本 cmake version: 3.5.2 系统版本: Ubuntun 16.04 cmake docment: 3.14.4 最后更新: 2019-05-30 二.指令说明 config ...
- Mongodb之备份恢复脚本
本分脚本: !/bin/bash #备份文件执行路径 which mongodump DUMP= #临时备份目录 OUT_DIR= #本分存放目录 TAR_DIR= #获取当前系统时间==> 2 ...
- c# .net Global.asax文件的作用
1 Global.asax文件的作用 先看看MSDN的解释,Global.asax 文件(也称为 ASP.NET 应用程序文件)是一个可选的文件,该文件包含响应 ASP.NET 或HTTP模块所引发的 ...