http://uoj.ac/problem/291 (题目链接)

题意

  一个写错的树状数组有多大的概率与正常树状数组得出的答案一样。

Solution

  可以发现这个树状数组维护的是后缀和。

  所以二维线段树维护二维数点$(l,r)$,表示左端点$l$与右端点$r$被修改次数相等的几率有多大。

  对于$l=1$的情况,另外开一个普通的线段树维护,操作不用重写。

细节

  标记可持久化,不然好像会被hack数据卡TLE?

代码

// uoj291
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<29)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=100010,MOD=998244353;
int n,m,rt[maxn<<2],ans;
struct node {
int son[2],p;
int& operator [] (int x) {return son[x];}
}tr[maxn*400]; LL power(LL a,LL b) {
LL res=1;
while (b) {
if (b&1) (res*=a)%=MOD;
b>>=1;(a*=a)%=MOD;
}
return res;
} namespace D2 {
int sz;
void modify(int &k,int l,int r,int s,int t,int p) {
if (!k) k=++sz,tr[k].p=1;
if (s<=l && r<=t) {
tr[k].p=(1LL*tr[k].p*p%MOD+1LL*(1-tr[k].p+MOD)*(1-p+MOD)%MOD)%MOD;
return;
}
int mid=(l+r)>>1;
if (s<=mid) modify(tr[k][0],l,mid,s,t,p);
if (t>mid) modify(tr[k][1],mid+1,r,s,t,p);
}
void query(int k,int l,int r,int p) {
if (!k) return;
ans=(1LL*ans*tr[k].p%MOD+1LL*(1-ans+MOD)*(1-tr[k].p+MOD)%MOD)%MOD;
int mid=(l+r)>>1;
if (p<=mid) query(tr[k][0],l,mid,p);
else query(tr[k][1],mid+1,r,p);
}
} namespace D1 {
void modify(int k,int l,int r,int s1,int t1,int s2,int t2,int p) {
if (s1<=l && r<=t1) {
D2::modify(rt[k],1,n,s2,t2,p);
return;
}
int mid=(l+r)>>1;
if (s1<=mid) modify(k<<1,l,mid,s1,t1,s2,t2,p);
if (t1>mid) modify(k<<1|1,mid+1,r,s1,t1,s2,t2,p);
}
void query(int k,int l,int r,int s,int t) {
D2::query(rt[k],1,n,t);
if (l==r) return;
int mid=(l+r)>>1;
if (s<=mid) query(k<<1,l,mid,s,t);
else query(k<<1|1,mid+1,r,s,t);
}
} int main() {
scanf("%d%d",&n,&m);
for (int op,l,r,i=1;i<=m;i++) {
scanf("%d%d%d",&op,&l,&r);
if (op==1) {
int p=power(r-l+1,MOD-2);
if (l!=r) D1::modify(1,1,n,l,r,l,r,(1-2*p%MOD+MOD)%MOD);
if (l>1) {
D1::modify(1,1,n,1,l-1,l,r,(1-p+MOD)%MOD);
D2::modify(rt[0],1,n,1,l-1,0);
}
if (r<n) {
D1::modify(1,1,n,l,r,r+1,n,(1-p+MOD)%MOD);
D2::modify(rt[0],1,n,r+1,n,0);
}
D2::modify(rt[0],1,n,l,r,p);
}
if (op==2) {
--l;ans=1;
if (!l) D2::query(rt[0],1,n,r);
else D1::query(1,1,n,l,r);
printf("%d\n",ans);
}
}
return 0;
}

【uoj291】 ZJOI2017—树状数组的更多相关文章

  1. [BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)

    4785: [Zjoi2017]树状数组 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 297  Solved: 195[Submit][Status ...

  2. 【BZOJ4785】[Zjoi2017]树状数组 树套树(二维线段树)

    [BZOJ4785][Zjoi2017]树状数组 Description 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一 ...

  3. bzoj4785 [Zjoi2017]树状数组

    Description 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来进 ...

  4. [ZJOI2017]树状数组

    Description 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道 基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来 ...

  5. bzoj4785:[ZJOI2017]树状数组:二维线段树

    分析: "如果你对树状数组比较熟悉,不难发现可怜求的是后缀和" 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\( ...

  6. LOJ2251 [ZJOI2017] 树状数组【线段树】【树套树】

    题目分析: 对于一个$add$操作,它的特点是与树状数组的查询相同,会给$1$到它自己产生影响,而$query$操作则会途径所有包含它的树状数组点.现在$add$操作具有前向性(不会影响之后的点).所 ...

  7. BZOJ4785 ZJOI2017树状数组(概率+二维线段树)

    可以发现这个写挂的树状数组求的是后缀和.find(r)-find(l-1)在模2意义下实际上查询的是l-1~r-1的和,而本来要查询的是l~r的和.也就是说,若结果正确,则a[l-1]=a[r](mo ...

  8. BZOJ4785 [Zjoi2017]树状数组 【二维线段树 + 标记永久化】

    题目链接 BZOJ4785 题解 肝了一个下午QAQ没写过二维线段树还是很难受 首先题目中的树状数组实际维护的是后缀和,这一点凭分析或经验或手模观察可以得出 在\(\mod 2\)意义下,我们实际求出 ...

  9. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

随机推荐

  1. vue + element 实现登录注册(自定义表单验证规则)

    注册页包含手机验证码登录和密码的二次验证. 效果如下: 实现代码: <template> <div> <div class="register-wrapper& ...

  2. Qt Creator 中,如何更改h,cpp,ui的文件并不让ui失效

    这个星期在使用qt,碰到一个很蛋疼的问题:创建对话框的时候,不小心输错了名字.而且是在很迟才发现的.这个时候对话框都已经布局差不多了,为了改名字,碰到更蛋疼的问题,改了名字后就无法使用转到槽的功能了. ...

  3. 《DISTRIBUTED SYSTEMS Concepts and Design》读书笔记 一

    第二章 系统模型 描述分布式系统的三种模型 Physical models : 用机器,网络,硬件等语言去描述整个系统. Architectural models : 用计算.计算任务.计算单元等语言 ...

  4. centos下部署redis服务环境及其配置说明

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主 ...

  5. NTP系统时间同步-操作记录

    在初始化一台linux服务器后,发现这台服务器的时间不对[root@dev ~]# date2016年 10月 11日 星期二 07:04:34 CST Linux时钟分为系统时钟 (System C ...

  6. Redis常用操作-------Hash(哈希表)

    1.HDEL key field [field ...] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略. 在Redis2.4以下的版本里, HDEL 每次只能删除单个域,如果你需要在一 ...

  7. Python基础系列讲解——random模块随机数的生成

    随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...

  8. Python_命名空间和作用域_25

    # 函数进阶 a = def func(): print(a) func() # 命名空间和作用域 # print() # input() # list # #命名空间 有三种 #内置命名空间 —— ...

  9. Linux内核分析第一次学习报告

    Linux内核分析第一次学习报告 学生 黎静 学习内容 1.存储程序计算机工作模型 冯诺依曼体系结构:核心思想为存储程序计算机. CPU抽象为for循环,总是执行下一条指令,内存保存指令和数据,CPU ...

  10. 2017-2018-2 1723《程序设计与数据结构》第八周作业 & 实验二 & 第一周结对编程 总结

    作业地址 第八周作业:https://edu.cnblogs.com/campus/besti/CS-IMIS-1723/homework/1847 (作业界面已评分,可随时查看,如果对自己的评分有意 ...