题目大意:给你一个代表区间$[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. 深入理解Jvm 虚拟机

    参考: 内存模型:https://blog.csdn.net/qq_34280276/article/details/52783096 类加载原理:https://nomico271.github.i ...

  2. python的arp扫描

    python的arp扫描 from optparse import *from scapy.all import *parser = OptionParser()parser.add_option(& ...

  3. Linux firewalld使用教程+rhce课程实验

    --timeout= 设置规则生效300秒 调试阶段使用,防止规则设置错误导致无法远程连接 实验:在server0机器上部署httpd服务,通过添加富规则,只允许172.25.0.10/32访问,并且 ...

  4. ExecuteReader()获得数据

    ExecuteReader用于实现只进只读的高效数据查询.ExecuteReader:返回一个SqlDataReader对象,可以通过这个对象来检查查询结果,它提供了只进只读的执行方式,即从结果中读取 ...

  5. 【读书笔记】深入应用C++11代码优化与工业级应用 读书笔记01

    第一章 使用C++11让程序更简洁.更现代 1.1  类型推导 1.1.1  auto类型推导 1.auto关键字的新意义 不同于python等动态类型语言的运行时进行变量类型的推导,隐式类型定义的类 ...

  6. [leetcode]17. Letter Combinations of a Phone Number手机键盘的字母组合

    Given a string containing digits from 2-9 inclusive, return all possible letter combinations that th ...

  7. Error running Tomcat8: Address localhost:xxxx is already in use

    参考自: https://blog.csdn.net/huazhongkejidaxuezpp/article/details/41813683 第一步,命令提示符号,执行命令:netstat -an ...

  8. linearlayout 中ImageView 居中等问题

    linearlayout  下的子控件使用android:layout_gravity=”center”  控件居左,没有达到居中的效果, 父窗体只能指定一种控件摆放方向 横向还是竖向 下面我弄了三个 ...

  9. 模板学习实践三 functor

    #include <iostream>#include <typeinfo> void foo(){ std::cout << "foo() called ...

  10. mui.fire()触发自定义事件

    导读:添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,通过mui.fire()方法可触发目标窗口的自定义事件. 监听自定义事件 添加自定义事件监听操作和标准js事件监听类 ...