原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day1T2.html

前言

在LOJ交了一下我的代码,发现它比选手机快将近 4 倍。

题解

对于线段树上每一个节点,维护以下信息:

1. 这个点为 1 的概率。

2. 这个点为 0 ,且它有祖先是 1 的概率。

其中,第一种东西在维护了 2. 的情况下十分好求。

第二种东西,只有两类:

1. 一次线段树操作涉及到所有的节点,显然只要乘 0.5 。

2. 某些节点打了标记之后,它的所有子孙都被他影响了。于是我们加个区间修改就好了。

时间复杂度 $O(n\log n)$ 。跑的很快。

好像有一种矩阵乘法的做法,但是它可能会被卡常数。

代码

#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof (x))
#define For(i,a,b) for (int i=a;i<=b;i++)
#define Fod(i,b,a) for (int i=b;i>=a;i--)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define fi first
#define se second
#define outval(x) printf(#x" = %d\n",x)
#define outtag(x) puts("----------------"#x"----------------");
#define outvec(x) printf("vec "#x" = ");For(_i,0,(int)x.size()-1)printf("%d ",x[i]);puts("");
#define outarr(x,L,R) printf(#x"[%d..%d] = ",L,R);For(__i,L,R)printf("%d ",x[i]);puts("");
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
LL read(){
	LL f=0,x=0;
	char ch=getchar();
	while (!isdigit(ch))
		f|=ch=='-',ch=getchar();
	while (isdigit(ch))
		x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
const int N=100005,mod=998244353;
int Pow(int x,int y){
	int ans=1;
	for (;y;y>>=1,x=(LL)x*x%mod)
		if (y&1)
			ans=(LL)ans*x%mod;
	return ans;
}
void Add(int &x,int y){
	if ((x+=y)>=mod)
		x-=mod;
}
void Del(int &x,int y){
	if ((x-=y)<0)
		x+=mod;
}
int n,m,inv2,P=1;
int ans=0;
int p[N<<2];
int p2[N<<2],add[N<<2];
void build(int rt,int L,int R){
	p[rt]=p2[rt]=0,add[rt]=1;
	if (L==R)
		return;
	int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
	build(ls,L,mid);
	build(rs,mid+1,R);
}
void pushson(int rt,int v){
	add[rt]=(LL)add[rt]*v%mod;
	p2[rt]=((LL)v*p2[rt]%mod+(LL)(mod+1-v)*(mod+1-p[rt])%mod)%mod;
}
void pushdown(int rt){
	if (add[rt]!=1){
		int ls=rt<<1,rs=ls|1;
		pushson(ls,add[rt]);
		pushson(rs,add[rt]);
		add[rt]=1;
	}
}
void update(int rt,int L,int R,int xL,int xR){
	if (R<xL||L>xR){
		Del(ans,p[rt]);
		p[rt]=((LL)p2[rt]*inv2+p[rt])%mod;
		Add(ans,p[rt]);
		p2[rt]=(LL)p2[rt]*inv2%mod;
		return;
	}
	int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
	if (xL<=L&&R<=xR){
		//no pushdown
		Del(ans,p[rt]);
		p[rt]=(LL)(p[rt]+1)*inv2%mod;
		Add(ans,p[rt]);
		p2[rt]=(LL)p2[rt]*inv2%mod;
		if (L!=R){
			pushson(ls,inv2);
			pushson(rs,inv2);
		}
		return;
	}
	pushdown(rt);
	Del(ans,p[rt]);
	p[rt]=(LL)p[rt]*inv2%mod;
	Add(ans,p[rt]);
	p2[rt]=(LL)p2[rt]*inv2%mod;
	update(ls,L,mid,xL,xR);
	update(rs,mid+1,R,xL,xR);
}
int main(){
	n=read(),m=read();
	build(1,1,n);
	inv2=(mod+1)/2;
	while (m--){
		int type=read();
		if (type==1){
			P=(LL)P*2%mod;
			int L=read(),R=read();
			update(1,1,n,L,R);
		}
		else {
			int val=(LL)ans*P%mod;
			printf("%d\n",val);
		}
	}
	return 0;
}

  

LOJ#3043.【ZJOI2019】 线段树 线段树,概率期望的更多相关文章

  1. jzoj5987. 【WC2019模拟2019.1.4】仙人掌毒题 (树链剖分+概率期望+容斥)

    题面 题解 又一道全场切的题目我连题目都没看懂--细节真多-- 先考虑怎么维护仙人掌.在线可以用LCT,或者像我代码里先离线,并按时间求出一棵最小生成树(或者一个森林),然后树链剖分.如果一条边不是生 ...

  2. 洛谷P5279 [ZJOI2019]麻将(乱搞+概率期望)

    题面 传送门 题解 看着题解里一堆巨巨熟练地用着专业用语本萌新表示啥都看不懂啊--顺便\(orz\)余奶奶 我们先考虑给你一堆牌,如何判断能否胡牌 我们按花色大小排序,设\(dp_{0/1,i,j,k ...

  3. LOJ 3043: 洛谷 P5280: 「ZJOI2019」线段树

    题目传送门:LOJ #3043. 题意简述: 你需要模拟线段树的懒标记过程. 初始时有一棵什么标记都没有的 \(n\) 阶线段树. 每次修改会把当前所有的线段树复制一份,然后对于这些线段树实行一次区间 ...

  4. 【LOJ#6029】市场(线段树)

    [LOJ#6029]市场(线段树) 题面 LOJ 题解 看着就是一个需要势能分析的线段树. 不难发现就是把第二个整除操作化为减法. 考虑一下什么时候整除操作才能变成减法. 假设两个数为\(a,b\). ...

  5. 【Loj#535】花火(线段树,扫描线)

    [Loj#535]花火(线段树,扫描线) 题面 Loj 题解 首先如果不考虑交换任意两个数这个操作,答案就是逆序对的个数. 那么暴力就是枚举交换哪个两个数,然后用数据结构之类的东西动态维护逆序对. 但 ...

  6. Loj #2570. 「ZJOI2017」线段树

    Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...

  7. UOJ#299. 【CTSC2017】游戏 线段树 概率期望 矩阵

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ299.html 前言 不会概率题的菜鸡博主做了一道概率题. 写完发现运行效率榜上的人都没有用心卡常数——矩阵怎么可以用数组 ...

  8. [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)

    [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...

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

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

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

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

随机推荐

  1. C/C++面试题:编写类String的构造函数、析构函数和赋值函数。

    转https://www.cnblogs.com/alinh/p/9636500.html 考点:构造函数.析构函数和赋值函数的编写方法出现频率:☆☆☆☆☆已知类String的原型为:         ...

  2. CSS3总结一:border(边框)

    Border-CSS1的属性 Border-CSS1:border Border-CSS1:border-style Border-CSS1:border-width Border-CSS1:bord ...

  3. Python——一个简单的类的创建和应用

    1.创建类,设置属性和给属性设定默认值,设置方法并访问类的属性: 2.利用类创建多个实例,以及调用类的方法的两种办法: 3.设置更新属性的函数,并更新实例的属性. class dog(object): ...

  4. lillietest 正态分布的拟合优度测试

    函数 lillietest格式 H = lillietest(X) %对输入向量X进行Lilliefors测试,显著性水平为0.05.H = lillietest(X,alpha) %在水平alpha ...

  5. java中import详解

    前言 import与package机制相关,这里先从package入手,再讲述import以及static import的作用. package package名称就像是我们的姓,而class名称就像 ...

  6. 三种工具绘制errorbar图

    误差棒是数据可变性的图形表示,并用于图表以指示所报告的测量中的误差或不确定性.他们给出了测量精确度的一般概念,或者相反,距报告值有多远,真实(无误差)值可能是多少.误差线通常代表不确定度的一个标准偏差 ...

  7. VGA、DVI、HDMI三种视频信号接口

    目前,电脑显示器常见的接口主要有HDMI.DP.DVI.VGA等4种接口.显示器数据线性能排名:DP>HDMI>DVI>VGA.其中 
VGA是模拟信号,已经被主流所淘汰,DVI.H ...

  8. jmeter创建时间函数

    固定格式的年月日 ${__time(yyyyMMdd,)} 20151214 //返回年月日 ${__time(HHmmss,)} 092816 //返回时分秒 ${__time(yyyyMMdd-H ...

  9. windows2012服务器中安装php7+mysql5.7+apache2.4环境

    1.下载安装apache.2.4 https://home.apache.org/~steffenal/VC14/binaries/httpd-2.4.38-win64-VC14.zip 解压到d盘的 ...

  10. linux编译相关命令

    一.编译可执行文件 g++ –c Hello.cpp  编译文件,生成目标文件Hello.o g++ Hello.o –o a.out  链接并重命名为可执行文件a.out g++ Hello.cc  ...