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] ...
随机推荐
- SparkStreaming和Drools结合的HelloWord版
关于sparkStreaming的测试Drools框架结合版 package com.dinpay.bdp.rcp.service; import java.math.BigDecimal; impo ...
- 2017.2.21 activiti实战--第十三章--流量数据查询与跟踪(一)查询接口介绍及运行时数据查询
学习资料:<Activiti实战> 第十三章 流量数据查询与跟踪 本章讲解运行时与历史数据的查询方法.主要包含三种:标准查询,Native查询,CustomSql查询. 13.1 Quer ...
- 2015年度新增开源软件排名TOP100
2015年度新增开源软件排名TOP100 本榜单包含2015年开源中国新收录的软件中,根据软件本身的关注度.活跃程度进行排名前100名的软件.从这份榜单中或许可以了解到最新业界的趋势. 1.Switc ...
- OpenStack 安装教程(使用Fuel )
OpenStack Fuel 安装教程 1介绍 OpenStack 是由 Rackspace 和 NASA 共同开发的云计算平台,帮助服务商和企业内部实现类似于 Amazon EC2 和 S3 的云基 ...
- Kali Linux 1.0 新手折腾笔记(2013.3.21更新)
rootoorotor昨天折腾了 Kali Linux 1.0,把大概的配置过程记录下来,希望对想接触或使用Kali Linux的同学有所帮助. 请注意: 1.本文为面向新手的教程,没技术含量,没事瞎 ...
- jmeter 压测工具
Apache jmeter 压力测试 java 环境安装 https://www.cnblogs.com/smyhvae/p/3788534.html 下载地址和文档 http://itopic.or ...
- vue 父子通信过程
1.概述 每个 Vue 实例都实现了事件接口,即: 使用 $on(eventName) 监听事件 使用 $emit(eventName, optionalPayload) 触发事件 2.示例一(未传递 ...
- [ACM] HDU 5024 Wang Xifeng's Little Plot (构造,枚举)
Wang Xifeng's Little Plot Problem Description <Dream of the Red Chamber>(also <The Story of ...
- spring-struts-mybatis整合错误集锦
尽管三大框架特别特别的好用,可是,当我第一次把这三个框架用maven整合到一起的时候.各种错误接踵而至,以下来做一下三大框架整合的总结: 首先是在导入三大框架的各种依赖包的时候,由于我用的是j2ee ...
- 【强网杯2018】逆向hide
这是事后才做出来的,网上没有找到现成的writeup,所以在这里记录一下 UPX加壳,而且linux下upx -d无法解,也无法gdb/ida attach 因为是64位,所以没有pushad,只能挨 ...