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. [Android实例] Scroll原理-附ScrollView源码分析 (转载)

    想象一下你拿着放大镜贴很近的看一副巨大的清明上河图, 那放大镜里可以看到的内容是很有限的, 而随着放大镜的上下左右移动,就可以看到不同的内容了 android中手机屏幕就相当于这个放大镜, 而看到的内 ...

  2. HDU1272 小希的迷宫(基础并查集)

    杭电的图论题目列表.共计500题,努力刷吧 AC 64ms #include <iostream> #include <cstdlib> #include <cstdio ...

  3. java GC(Garbage Collector) | System.gc()

    http://win.sy.blog.163.com/blog/static/94197186201151093543556/     Java垃圾回收调优

  4. linux 静态库使用经验

    在编写程序的过程中,对于一些接口往往抽象成lib库的形式,甚至有些程序只有一个主程序,其他接口的调用都是库的形式存在.较多的使用库会比较利于程序的维护,因为我们的程序都可以被其他的人使用,但是往往库的 ...

  5. java变参

    java变参是通过数组来实现的 Object[] addAll(Object[] array1, Object... array2)和Object[] addAll(Object[] array1, ...

  6. Android - 单例模式(singleton)的使用

    单例模式(singleton)的使用 本文地址:http://blog.csdn.net/caroline_wendy 单例(singleton)是特殊的Java类,在创建实例时.一个类仅同意创建一个 ...

  7. 使用java+TestNG进行接口回归测试

    TestNG是一个开源自动化测试框架,“NG”表示下一代(Next Generation的首字母). TestNG类似于JUnit(特别是JUnit 4),但它不是JUnit框架的扩展,相较于Juni ...

  8. request 获取请求头

    /********************************************************servlet页面********************************** ...

  9. php通过curl下载远程图片实例

    <?php $url = 'http://mf1905.com/upload/video_img/df3074c98ec5124ad47c52ff59f74e04_middle.jpeg'; f ...

  10. React系列之--props属性

    版权声明:本文为博主原创文章,未经博主允许不得转载. PS:转载请注明出处作者:TigerChain地址:http://www.jianshu.com/p/fa81cebac3ef本文出自TigerC ...