题目大意:给你一个代表区间$[1,n]$的线段树,问你随机访问区间$[1,n]$中的一个子区间,覆盖到的线段树节点个数的期望(需要乘上$\frac{n(n-1)}{2}$后输出)。

数据范围:$n≤10^{18}$

貌似各位的做法都非常优秀,代码也非常短,那么我来讲一个垃圾做法:

我们设$f[i]$表示一个构建出$[1,i]$的线段树,随机访问一个子区间覆盖线段树节点个数的期望(为方便处理,乘上了$\frac{i(i-1)}{2}$)。

显然$f[n]$就是答案。

我们再设$fl[j][i]$表示一棵$[1,i]$的线段树,从左边往右,覆盖了$j$个线段树节点的方案数。

同理我们处理出$fr[j][i]$

我们发现:当$j>1$时,选择覆盖$j$个点,这$j$个点显然不会包含整个区间。

我们设$L=\lceil \frac{i}{2}\rceil$ ,$R=\lfloor \frac{i}{2} \rfloor $

那么有$fl[i][j]=fl[j][L]+fl[j-1][r]-[j≤2],fr[i][j]$同理。

我们考虑$f[i]$要怎么求。

不难发现,$f[i]$有四种构成方式:只选择了左/右端的区间,两边都选了,恰好选择了根节点。

只选择一侧的显然是$f[L]+f[R]$,恰好选择根节点的贡献显然为$1$。

对于两边都选的情况,我们通过枚举$fr[][L]$和$fl[][R]$,简单地乘起来,再乘上总共选择的节点个数,就可以了。

综上,则有:

$f[i]=1+f[L]+f[R]+\sum\limits_{v_1=1}^{dep_1}\sum\limits_{v_2=1}^{dep_2} (v_1+v_2)\times\bigg(fr[v_1][L]\times fl[v_2][R]-[v1=1,v2=1]\bigg)$

其中,$dep1$,$dep2$表示左右两颗子树的最大深度。

在求解过程中,我们暴力往下递归,我们需要特判$i=1,2,3$的情况,然后就可以了。

这个复杂度比较垃圾,应该是$O(log^3\ n)$的。

场上真刺激,最后十分钟调处来了23333

 #include<bits/stdc++.h>
#define M 998244353
#define L long long
#define MOD 998244353
using namespace std; map<L,L> f,fl[],fr[],vis,up; void solve(L i){
if(vis[i]) return;
if(i==){
f[i]=fl[][i]=fr[][i]=vis[i]=;
fl[][i]=fr[][i]=up[i]=;
return;
}
if(i==){
f[i]=;
fl[][i]=fr[][i]=;
fl[][i]=fr[][i]=;
vis[i]=up[i]=;
return;
}
if(i==){
f[i]=;
fl[][i]=; fr[][i]=;
fl[][i]=fr[][i]=;
vis[i]=; up[i]=;
fr[][i]=;
return;
}
L l=(i+)>>,r=i-l;
solve(l); solve(r);
int upl=up[l],upr=up[r],UP=max(upl,upr)+; up[i]=UP;
vis[i]=;
L sum=f[l]+f[r];
for(int v1=;v1<=upl;v1++)
for(int v2=;v2<=upr;v2++){
sum=(sum+1LL*(v1+v2)*(fr[v1][l]*fl[v2][r]%MOD+MOD-(v1==&&v2==)))%MOD;
}
// for(int v1=0;v1<=upl;v1++) sum=(sum-fr[v1][l])%MOD;
// for(int v2=0;v2<=upr;v2++) sum=(sum-fl[v2][r])%MOD;
f[i]=(sum+)%MOD;
for(int j=;j<=UP;j++){
fl[j][i]=(fl[j][l]+fl[j-][r]-(j<=)+MOD)%MOD;
int x=fl[j][i];
fr[j][i]=(fr[j-][l]+fr[j][r]-(j<=)+MOD)%MOD;
int y=fr[j][i];
x++;
}
// cout<<fr[2][3]<<endl;
fl[][i]=fr[][i]=;
fl[][i]++; fr[][i]++;
} int main(){
L n;cin>>n;
solve(n);
cout<<f[n]<<endl;
}

【2019北京集训测试赛(十三)】数据(sj) 冷静分析的更多相关文章

  1. 【2019北京集训测试赛(七)】 操作 分治+FFT+生成函数

    题目大意:你有$n$个操作和一个初始为$0$的变量$x$. 第$i$个操作为:以$P_i$的概率给$x$加上$A_i$,剩下$1-P_i$的概率给$x$乘上$B_i$. 你袭击生成了一个长度为$n$的 ...

  2. 2016北京集训测试赛(十三) Problem B: 网络战争

    Solution KD tree + 最小割树

  3. 2016北京集训测试赛(十六)Problem A: 任务安排

    Solution 这道题告诉我们, 不能看着数据范围来推测正解的时间复杂度. 事实证明, 只要常数足够小, \(5 \times 10^6\)也是可以跑\(O(n \log n)\)算法的!!! 这道 ...

  4. 【2016北京集训测试赛(十)】 Azelso (期望DP)

    Time Limit: 1000 ms   Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之 ...

  5. 【2016北京集训测试赛(二)】 thr (树形DP)

    Description 题解 (这可是一道很早就碰到的练习题然后我不会做不想做,没想到在Contest碰到欲哭无泪......) 题目大意是寻找三点对的个数,使得其中的三个点两两距离都为d. 问题在于 ...

  6. 【2016北京集训测试赛(八)】 crash的数列 (思考题)

    Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多 ...

  7. 【2016北京集训测试赛(十六)】 River (最大流)

    Description  Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...

  8. 【2016北京集训测试赛】river

    HINT 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. [吐槽] 嗯..看到这题的想法的话..先想到了每个点的度为2,然后就有点不知所措了 隐隐约约想到了网络流,但并没 ...

  9. 【2016北京集训测试赛】azelso

    [吐槽] 首先当然是要orzyww啦 以及orzyxq奇妙顺推很强qwq 嗯..怎么说呢虽然说之前零零散散做了一些概d的题目但是总感觉好像并没有弄得比较明白啊..(我的妈果然蒟蒻) 这题的话可以说是难 ...

随机推荐

  1. cdnbest节点动态ip配置教程

    1.安装节点后,在未初始化里初始化节点,如下图操作,要选择动态ip(注:动态ip节点不支持添加辅ip) 服务器如果是动态ip,选择了动态ip选项,节点在自动更换了新的ip后,在节点列表里的ip和dns ...

  2. c++ 面试题(操作系统篇)

    1,消息队列: https://kb.cnblogs.com/page/537914/ 2,fork中父进程和子进程的资源联系: https://blog.csdn.net/weixin_422506 ...

  3. Centos7编译安装lnmp(nginx1.10 php7.0.2)

    我使用的是阿里云的服务器 Centos7 64位的版本 1. 连接服务器 这个是Xshell5的版本 安装好之后我们开始连接服务器 2. 安装nginx 首先安装nginx的依赖 yum instal ...

  4. Apache ab 压力并发测试工具

    当你使用PHP(或其他编程语言)完成一个web程序的开发,并且web程序在Apache服务器上正常运行的时候,你有没有考虑过对你的Apache服务器及部署在其上的web程序进行一些压力测试呢?毕竟,真 ...

  5. 解决在jupyter notebook中遇到的ImportError: matplotlib is required for plotting问题

    昨天学习pandas和matplotlib的过程中, 在jupyter notebook遇到ImportError: matplotlib is required for plotting错误, 以下 ...

  6. eclipse定制化配置调优、初始化配置指南、可以解决启动慢等问题

    配置eclipse的jvm参数 打开eclipse根目录下的eclipse.ini在最后面加上如下的jvm参数 -Xms400m -Xmx1400m -XX:NewSize=128m -XX:MaxN ...

  7. 线程的使用方法start run sleep join

    今天回顾了Java的线程的一些知识 例1:下面代码存有详细的解释 主要是继承Thread类与实现Runnable接口 以及start()和run()方法 package com.date0607; / ...

  8. paired-end reads的拼接

    paired-end reads的拼接 发表于2012 年 8 月 13 日 Velvet中paired-end reads的拼接 文件格式 要将两头测序(paired-end)的reads放到同一个 ...

  9. c++沉思录 学习笔记 第五章 代理类

    Vehicle 一个车辆的虚基类 class Vehicle {public: virtual double weight()const = 0; virtual void start() = 0; ...

  10. python_day13_js

    JavaScript 基础 目录: javascript简介 javascrip历史 ecmascript标准 javascrip基础 js引入方式 js变量.常量.标识符 js数据类型 运算符 流程 ...