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的线段树的更多相关文章

  1. 洛谷P5111 zhtobu3232的线段树

    题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...

  2. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  3. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  4. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  5. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  6. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  7. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  8. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  9. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

随机推荐

  1. nginx 配置静态目录 访问bootstrap

    location /static/ { alias /Users/wangziqiang/djangoprojects/bpmTest/static/; } 注意  /static/   中 /的完整 ...

  2. 每天一个 Linux 命令(57):ss命令

    ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信 ...

  3. 在Linux下安装R语言软件

    安装环境: centos.R3.0.1 1.在终端下下载: #cd /usr/local/ #wget http://mirror.bjtu.edu.cn/cran/src/base/R-3/R-3. ...

  4. 管理voting disks

     管理voting disks 一.关于voting disk 的一些必需要知道的东西: 11g 曾经我们能够使用dd 命令来备份voting disk ,可是在11g 以后 oracle 不再支 ...

  5. 设计模式之Protocol实现代理模式

    使用场合 使用步骤 不使用protocol实现代理 使用protocol实现代理 一.使用场合 A想让B帮忙,就让B代理 A想通知B发生了一些事情,或者传一些数据给B 观察者模式 二.使用步骤 定义一 ...

  6. sprint3 【每日scrum】 TD助手站立会议第五天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 通过网上的介绍懂得了闹钟的添加和工作原理,然后加入了震动效果 在添加日程类型处添加了选择闹钟间隔多长时间相应,并写了闹钟运行的类 广播协议也弄 ...

  7. Lua学习六----------Lua流程控制

    © 版权声明:本文为博主原创文章,转载请注明出处 Lua流程控制 - 通过程序设定一个或多个条件语句 - 在条件为true时执行指定程序代码,在条件为false时指定其他指定程序代码 - 控制结构语句 ...

  8. iostat命令具体解释——linux性能分析

    之前总结uptime和free命令,今天继续来总结一下iostat.给自己留个笔记.同一时候也希望对大家实用. 版本号信息: sysstat version 9.0.4           (C) S ...

  9. zookeeper启动流程简单梳理

    等着測试童鞋完工,顺便里了下zookeeper的启动流程 zk3.4.6 启动脚本里面 nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_ ...

  10. Windows系统下正确安装MongoDB

    1.下载.安装 官网下载: http://www.mongodb.org/downloads 下载好之后,接下来进行安装了: 2.创建数据文件夹 MongoDB将数据文件夹存储在 db 文件夹下. 可 ...