BZOJ4785: [Zjoi2017]树状数组

洛谷使用指南 详细看——这样就对了!!!当显示以上页面时表示进入了注册页面。当注册好后就可以登陆了。当显示以上页面时表示进入了登录页面。 阅读详情

题目大意:给了一种错误的实现树状数组方式,每次随机在一个区间里修改一个值,问每次询问得到的答案是正确的概率

首先我们可以慢慢琢磨一下这份代码:发现其实他就是在求后缀和
然后由于模2,其实整道题都相当于在异或
这样每次Query(L,R)=Find(R)−Find(L−1)=Xor(R,n)⊕Xor(L−1,n)=Xor(L−1,R−1)
而实际上我们要求的是Xor(L,R),所以区别就在于L-1和R这两个位置
我们只需要统计:在这次询问之前的修改,有多少概率修改了这两个点总共偶数次

我们可以对之前的修改操作建一个树套树,其中对左端点建外层线段树,对右端点建内层平衡树,这样就可以支持我们查询左端点在一定范围内,右端点在另一个范围内,修改次数为偶数次的概率是多少了

需要注意:1.我们需要维护两个概率,p和2*p,分别代表L-1和R在这个区间内出现一次和两次的概率,然后分类讨论分别计算
2.当询问的L=1时,实际上Query(L,R)=Xor(R,n)=Xor(1,n)⊕Xor(1,R−1),所以这个时候答案只和R被修改偶数次的概率和总修改次数有关

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100010
#define M 2000010
using namespace std;
int mod=998244353;
int l[N<<2],r[N<<2],rt[N<<2];
int ls[M],rs[M],rnd[M],a[M],LL[M],RR[M],cnt;
long long a1[M],a2[M],A1[M],A2[M];
void build(int now,int ll,int rr)
{
    l[now]=ll;r[now]=rr;
    if(ll==rr) return;
    int mid=(ll+rr)>>1;
    build(now<<1,ll,mid);
    build(now<<1|1,mid+1,rr);
}
void pup(int x)
{
    a1[x]=(a1[ls[x]]*a1[rs[x]]+(mod+1-a1[ls[x]])*(mod+1-a1[rs[x]]))%mod;
    a2[x]=(a2[ls[x]]*a2[rs[x]]+(mod+1-a2[ls[x]])*(mod+1-a2[rs[x]]))%mod;
    int tmp1,tmp2;
    a1[x]=(a1[x]*A1[x]+(mod+1-a1[x])*(mod+1-A1[x]))%mod;
    a2[x]=(a2[x]*A2[x]+(mod+1-a2[x])*(mod+1-A2[x]))%mod;
    if(ls[x]) LL[x]=LL[ls[x]];else LL[x]=a[x];
    if(rs[x]) RR[x]=RR[rs[x]];else RR[x]=a[x];
}
void zxu(int &k)
{
    int t=ls[k];
    ls[k]=rs[t];
    rs[t]=k;
    pup(k);pup(t);
    k=t;
}
void yxu(int &k)
{
    int t=rs[k];
    rs[k]=ls[t];
    ls[t]=k;
    pup(k);pup(t);
    k=t;
}
void add(int &k,int x,int v)
{
    if(!k)
    {
        cnt++;k=cnt;
        A1[cnt]=a1[cnt]=(1-v+mod)%mod;
        A2[cnt]=a2[cnt]=(1-2*v%mod+mod)%mod;
        rnd[cnt]=rand();LL[cnt]=RR[cnt]=a[cnt]=x;
        return;
    }
    if(a[k]==x)
    {
        int tmp1,tmp2;
        a1[k]=(a1[k]*(1-v+mod)+(mod+1-a1[k])*v)%mod;
        a2[k]=(a2[k]*(1-2*v%mod+mod)+(mod+1-a2[k])*2*v)%mod;

        A1[k]=(A1[k]*(1-v+mod)+(mod+1-A1[k])*v)%mod;
        A2[k]=(A2[k]*(1-2*v%mod+mod)+(mod+1-A2[k])*2*v)%mod;
        return;
    }
    if(a[k]<x)
    {
        add(rs[k],x,v);
        if(rnd[rs[k]]>rnd[k]) yxu(k);
    }
    else
    {
        add(ls[k],x,v);
        if(rnd[ls[k]]>rnd[k]) zxu(k);
    }
    pup(k);
}
void change(int now,int x,int y,int v)
{
    add(rt[now],y,v);
    if(l[now]==r[now]) return;
    int mid=(l[now]+r[now])>>1;
    if(x<=mid) change(now<<1,x,y,v);
    else change(now<<1|1,x,y,v);
}
long long ansa;
int L,R;
void query1(int k)
{
    if(!k) return;
    if(LL[k]>R||RR[k]<L) return;
    if(LL[k]>=L&&RR[k]<=R)
    {
        ansa=(ansa*a1[k]+(mod+1-ansa)*(mod+1-a1[k]))%mod;
        return;
    }
    if(R<a[k]) query1(ls[k]);
    else if(L>a[k]) query1(rs[k]);
    else
    {
        ansa=(ansa*A1[k]+(mod+1-ansa)*(mod+1-A1[k]))%mod;
        query1(ls[k]);
        query1(rs[k]);
    }
}
void query2(int k)
{
    if(!k) return;
    if(LL[k]>R||RR[k]<L) return;
    if(LL[k]>=L&&RR[k]<=R)
    {
        ansa=(ansa*a2[k]+(mod+1-ansa)*(mod+1-a2[k]))%mod;
        return;
    }
    if(R<a[k]) query2(ls[k]);
    else if(L>a[k]) query2(rs[k]);
    else
    {
        ansa=(ansa*A2[k]+(mod+1-ansa)*(mod+1-A2[k]))%mod;
        query2(ls[k]);
        query2(rs[k]);
    }
}
void check1(int now,int ll,int rr)
{
    if(l[now]==ll&&r[now]==rr)
    {
        query1(rt[now]);
        return;
    }
    int mid=(l[now]+r[now])>>1;
    if(rr<=mid) check1(now<<1,ll,rr);
    else if(ll>mid) check1(now<<1|1,ll,rr);
    else check1(now<<1,ll,mid),check1(now<<1|1,mid+1,rr);
}
void check2(int now,int ll,int rr)
{
    if(l[now]==ll&&r[now]==rr)
    {
        query2(rt[now]);
        return;
    }
    int mid=(l[now]+r[now])>>1;
    if(rr<=mid) check2(now<<1,ll,rr);
    else if(ll>mid) check2(now<<1|1,ll,rr);
    else check2(now<<1,ll,mid),check2(now<<1|1,mid+1,rr);
}
int ksm(int d,int c)
{
    long long ret=1;
    while(c)
    {
        if(c&1) ret=ret*d%mod;
        d=(long long)d*d%mod;c/=2;
    }
    return (int)ret;
}
char __ch,__B[1<<15],*__S=__B,*__T=__B;
#define getc() (__S==__T&&(__T=(__S=__B)+fread(__B,1,1<<15,stdin),__S==__T)?0:*__S++)
#define isd(c) (c>='0'&&c<='9')
int __a;
int read(){
    while(__ch=getc(),!isd(__ch));(__a=__ch-'0');
    while(__ch=getc(),isd(__ch))__a=__a*10+__ch-'0';return __a;
}
int main()
{
    int n,m;
    n=read();m=read();
    int o,x,y;
    build(1,1,n);
    a1[0]=a2[0]=1;
    int totchange=0;
    int tot=0;
    while(m--)
    {
        o=read();x=read();y=read();
        if(o==1) totchange++,change(1,x,y,ksm(y-x+1,mod-2));
        else
        {
            if(x!=1)
            {
                x--;

                ansa=1;
                L=x;R=y-1;
                check1(1,1,x);
                L=y;R=n;
                check2(1,1,x);
                L=y;R=n;
                check1(1,x+1,y);
            }
            else
            {
                ansa=1;
                L=y;R=n;
                check1(1,1,y);
                if(totchange&1) ansa=mod+1-ansa;
            }
            printf("%lld\n",ansa%mod);
        }
    }
}
洛谷小游戏大全(用洛谷的人都得知道) 阅读详情

相关推荐

Android Camera Sensor HDR详解

本文详细介绍了Android相机传感器(Sensor)中实现高动态范围(HDR)采集的各种技术方式。主要内容包括: Sensor HDR技术分类 帧内HDR(Single-Frame HDR):在同一帧同一像素内完成多增益采集,无运动伪影和帧率损失,包括DAG(双模拟增益)、DCG(双转换增益)等技术 帧间HDR(Multi-Frame HDR):通过多帧曝光实现,如DOL(数字重叠)、Staggered HDR等 混合HDR:结合多种技术的复合方案 详细技术原理 重点解析了DAG和DCG两种主流帧内HDR

DU_YULIN的博客 362

(洛谷入门系列,适合洛谷新用户)洛谷功能全解

对洛谷功能进行详细解说,适合初入洛谷的新手阅读。

rrc12345的博客 10万+

提示词工程的几个参数

低 temperature + 低 top-p:输出最稳定、最可靠,适合需要准确性和一致性的场景。高 temperature + 高 top-p:输出最多样化、最富有创意,适合需要灵感和探索的场景。Max Length:您可以通过调整max length来控制大模型生成的 token 数。指定 Max Length 有助于防止大模型生成冗长或不相关的响应并控制成本。是一个字符串,可以阻止模型生成 token,指定是控制大模型响应长度和结构的另一种方法。例如,您可以通过添加 “11” 作为。

weixin_44212787的博客 1827

洛谷做题指南,入门首选最详细的写题指南,适合洛谷新用户

本篇文章写于2023年10月21日;若洛谷此后有更新变动,可以私聊我,本篇文章将会从零开始教你如何使用洛谷快速高效的做题。

weixin_73842023的博客 2万+

《iOS之一起进大厂》系列-秒杀面试官的RunLoop底层原理面试题

Runloop是iOS面试中的必考题,不管大厂小厂都会问到。 这里包括了Runloop几乎所有的面试题,还有中肯完整的答案解释。

空杯子 1153

基于 MATLAB 的综合能源系统建模案例 

电平衡约束:P_{gt}(t)+P_{grid}(t)-P_{eb}(t)-P_{load}(t)=0,其中 P_{grid}(t) 为与外部电网的交互功率(正表示购电,负表示售电)。- 电锅炉的热输出功率 Q_{eb} 与输入电功率 P_{eb} 的关系为:Q_{eb}=\eta_{eb}\times P_{eb},其中 \eta_{eb} 为电锅炉的热效率。- 燃气轮机的余热回收功率 Q_{gt} 与发电功率也存在一定关系,例如:Q_{gt}=c\times P_{gt},c 为余热回收比例系数。

qq_57128262的博客 1395

洛谷使用方法

访问洛谷官网,点击右上角的注册按钮输入对应信息用户名不能有中文,之后输入验证码即可。

qq_44645338的博客 1万+

海康网口相机不能被flexscan3d识别到MVS版本为4.6.1,flex为3.3.24在MVS中能够检测到,但是在flex中只能看到电脑自带相机,如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1047

BZOJ4785 [Zjoi2017]树状数组

扯淡: 昨天就在BZOJ上看到了题,但是光老师说今天考ZJOI的题,就一直没看 看完题看了看部分分,所有修改在所有询问之前?那这题是不是肯定是cdq啊 然后YYYY,YY了一个贼JB恶心的CDQ,写了9000B,然后发现我们测的时候开4秒,觉得在校OJ上4秒肯定跑不过就交了70分暴力 后来考试结束了发现标程跑了3秒9……于是把时限开到8s,6s就过了 如果上天再给我一次机会,我一定写一个

neither_nor 1272

使用 MATLAB/Simulink 构建一个 核电站汽轮机与发电机协调控制系统 的仿真模型

在核电机组中,汽轮机-发电机系统是将核能最终转化为电能的关键环节。与火电机组不同,核反应堆的热惯性大、功率调节慢,因此汽轮机的控制策略需与反应堆特性相匹配,实现安全、稳定、高效的能量转换。维持发电机输出功率/频率稳定(响应电网调度)调节汽轮机进汽压力(匹配一回路蒸汽供应)实现“堆-机协调控制”保障机组在启停、变负荷、甩负荷等工况下的安全性本教程将带你使用构建一个核电站汽轮机与发电机协调控制系统汽轮机调速系统(调门控制)建模发电机与电网接口建模(同步机)

xiaoheshang_123的博客 189

matlab 点云学习目录【2026最新版】

matlab 点云学习目录。博客长期更新,本文最近更新时间为:2026年6月15日。

点云侠的博客 3万+

[BZOJ]4785: [Zjoi2017]树状数组

题解:......推了一晚上的式子 ....zjoi签到题.....感觉自己废了啊 首先看懂题目代码在干啥 ...分析一下 他求的是后缀和 也就是对于查询[l,r]你需要看第l-1和第r位置 被修改次数和为偶数次的概率 然后用二维平面点表示 维护每个点出现偶数次的概率 对于l=1是需要考虑 整个序列被修改次数 已经第r位置的修改情况 然后就是裸树套树(线段树套线段树 #inclu...

weixin_30394251的博客 100

YOLOv5_DeepSORT_Pytorch训练自己的多目标跟踪模型

1 准备 环境配置:https://blog.youkuaiyun.com/weixin_50008473/article/details/115250986?spm=1001.2014.3001.5501 YOLOv5_DeepSORT_Pytorch代码地址: https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch DeepSORT论文:https://arxiv.org/pdf/1703.07402.pdf 2 训练目标检测模型 训练自己的目标检测模

weixin_50008473的博客 1万+

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

【BZOJ4785】[Zjoi2017]树状数组 Description 漆黑的晚上,九条可怜躺在床上辗转反侧。难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历。那是一道基础的树状数组题。给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作,操作有两种: 1 x,表示将 Ax 变成 (Ax + 1) mod 2。 2 l r,表示询问 sigma(Ai) mo...

weixin_30770783的博客 113

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[Zjoi2017]bzoj4785 树状数组

这是一道神题。 结论题。 考场上我居然只打了暴搜,连dp都没敲。 省选debuff挺高的啊其实是因为我是蒟蒻智商不够 这题是非常可做的。 考完订正时,借着题解推了推,很快—— 当询问的l>1时,是问l-1~r-1与l~r的答案是否一样。 当l==1时,是询问到点r的前缀和是否等于后缀和。 无脑树套树啊。 我的常数丑了uoj上额外数据T了,97分;bzoj上约19.5s过了。 C

chenyanbo1111的博客 779

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

bzoj4785 UOJ #291 ZJOI2017 Day1 树状数组

解题思路可以打表发现 错误的树状数组ii对jj产生贡献当且仅当i≥ji\geq j. 正确的树状数组ii对jj产生贡献当且仅当i≤ji\leq j. 那么可以发现假如我的一个询问l,rl,r,产生贡献的位置只可能是l−1l-1或rr.那现在的操作就很简单了,对于一个修改,他的产生贡献的区间可以按照他的端点来分类讨论,然后就直接上树套树就好了。参考程序#include<cstdio> #incl

Jason Victor Yan's 1095

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

bzoj4785: [Zjoi2017]树状数组

传送门 老司机应该能发现他求的是后缀和吧。 然后就变成了判断a[l-1]==a[r]的概率。 区间覆盖的二维线段树水过。#include<cstdio> #include<cstdlib> #include<iostream> #include<cmath> #include<cstring> #include<algorithm> #define N 100005 #define ll lo

zyy大蒟蒻的博客 428

BZOJ4785 [Zjoi2017]树状数组

标签:树套树 题目 题目传送门 Description 漆黑的晚上,九条可怜躺在床上辗转反侧。难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历。那是一道 基础的树状数组题。给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作,操作有两种: 1 x,表示将 Ax 变成 (Ax + 1) mod 2。 2 l r,表示询问 sigma(Ai) mod 2,L&...

Welcome to yjjr's blog! 457

BZOJ4785: [Zjoi2017]树状数组(树套树)

传送门 题解: 相当于询问你al−1al−1a_{l-1}和arara_r相同的几率(注意特判l=1l=1l=1的情况)。 记他们相等的几率为p0p0p_0,不等的几率为p1p1p_1,考虑一个询问对这个几率的影响: 1.只包含l−1l−1l-1或者rrr。 此时有1len1len\frac{1}{len}的几率p0,p1p0,p1p_0,p_1互换。 2.同时包含l−1,rl−1,r...

DZYO的博客 326

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

分析: “如果你对树状数组比较熟悉,不难发现可怜求的是后缀和” 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\(r\)的后缀,\(\sum_{i=l-1}^{r-1}A_i\)),而答案为\(A_l\)到\(A_r\)的和(即\(\sum_{i=l}^{r}A_i\))这两种答案都包含\(A_l\)到\(A_{r-1}\)的和,因...

weixin_30279751的博客 135

bzoj 4785: [Zjoi2017]树状数组【树套树】

参考:https://www.cnblogs.com/ljh2000-jump/p/6686960.html 由于操作反过来了,所以显然树状数组维护后缀和,所以本来想查询(1,r)-(1,l-1),现在变成了(r,n)-(l-1,n); 然后在mod 2意义下进行,每次又是+1,就相当于是异或操作了; 所以现在这样的树状数组和正确的差别就在l-1和r这两个位置上,所以只要维护(x,y)(x<...

weixin_30550271的博客 129

[BZOJ4785][ZJOI2017]树状数组(树套树)

可以发现,这个树状数组实际上求的是后缀和。而这样子求出的区间和,只有l−1l-1和rr两个点的差别。于是第二问就转化成A[l−1]=A[r]A[l-1]=A[r]的概率,但是要特判l=1l=1的情况(l=1l=1时正确的概率为∑ri=1A[i]≡∑ni=rA[i](mod2)\sum_{i=1}^rA[i]\equiv\sum_{i=r}^nA[i](\mod 2)的概率)。 这里设f(i,j)f

女装的你,如此好看! 732

UOJ291 BZOJ4785 ZJOI2017树状数组

题目 23333 代码: #include<cstdio> #include<cstring> #include<iostream> #define For(i,x,y) for(int i=x;i<=y;++i) using namespace std; const int N = 1e5+5; const int P = 99...

weixin_30783913的博客 140

BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l - 1, r - 1]的区间和。什么时候[l - 1, r - 1]的区间和与[l, r]的想等呢?就是位置l - 1与r对应的值相等的时候。于是问题就转换成了:修改操作每次随机修改区间中的一个位置...

weixin_30820151的博客 132

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

4785: [Zjoi2017]树状数组 Time Limit: 40 SecMemory Limit: 512 MBSubmit: 297Solved: 195[Submit][Status][Discuss] Description 漆黑的晚上,九条可怜躺在床上辗转反侧。难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历。那是一道 基础的树状数组题。给出一个...

weixin_30396699的博客 104

【bzoj4785】[Zjoi2017]树状数组 线段树套线段树

题目描述 漆黑的晚上,九条可怜躺在床上辗转反侧。难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历。那是一道基础的树状数组题。给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作,操作有两种: 1 x,表示将 Ax 变成 (Ax + 1) mod 2。 2 l r,表示询问 sigma(Ai) mod 2,L<=i<=r 尽管那个时候的可怜非常的 simp...

weixin_30455365的博客 80
上一篇: BZOJ4784: [Zjoi2017]仙人掌
下一篇: BZOJ1127: [POI2008]KUP
commonc
博客等级 码龄11年 173粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值