【2019北京集训测试赛(十三)】数据(sj) 冷静分析
题目大意:给你一个代表区间$[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) 冷静分析的更多相关文章
- 【2019北京集训测试赛(七)】 操作 分治+FFT+生成函数
题目大意:你有$n$个操作和一个初始为$0$的变量$x$. 第$i$个操作为:以$P_i$的概率给$x$加上$A_i$,剩下$1-P_i$的概率给$x$乘上$B_i$. 你袭击生成了一个长度为$n$的 ...
- 2016北京集训测试赛(十三) Problem B: 网络战争
Solution KD tree + 最小割树
- 2016北京集训测试赛(十六)Problem A: 任务安排
Solution 这道题告诉我们, 不能看着数据范围来推测正解的时间复杂度. 事实证明, 只要常数足够小, \(5 \times 10^6\)也是可以跑\(O(n \log n)\)算法的!!! 这道 ...
- 【2016北京集训测试赛(十)】 Azelso (期望DP)
Time Limit: 1000 ms Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之 ...
- 【2016北京集训测试赛(二)】 thr (树形DP)
Description 题解 (这可是一道很早就碰到的练习题然后我不会做不想做,没想到在Contest碰到欲哭无泪......) 题目大意是寻找三点对的个数,使得其中的三个点两两距离都为d. 问题在于 ...
- 【2016北京集训测试赛(八)】 crash的数列 (思考题)
Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多 ...
- 【2016北京集训测试赛(十六)】 River (最大流)
Description Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...
- 【2016北京集训测试赛】river
HINT 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. [吐槽] 嗯..看到这题的想法的话..先想到了每个点的度为2,然后就有点不知所措了 隐隐约约想到了网络流,但并没 ...
- 【2016北京集训测试赛】azelso
[吐槽] 首先当然是要orzyww啦 以及orzyxq奇妙顺推很强qwq 嗯..怎么说呢虽然说之前零零散散做了一些概d的题目但是总感觉好像并没有弄得比较明白啊..(我的妈果然蒟蒻) 这题的话可以说是难 ...
随机推荐
- 深入理解Jvm 虚拟机
参考: 内存模型:https://blog.csdn.net/qq_34280276/article/details/52783096 类加载原理:https://nomico271.github.i ...
- python的arp扫描
python的arp扫描 from optparse import *from scapy.all import *parser = OptionParser()parser.add_option(& ...
- Linux firewalld使用教程+rhce课程实验
--timeout= 设置规则生效300秒 调试阶段使用,防止规则设置错误导致无法远程连接 实验:在server0机器上部署httpd服务,通过添加富规则,只允许172.25.0.10/32访问,并且 ...
- ExecuteReader()获得数据
ExecuteReader用于实现只进只读的高效数据查询.ExecuteReader:返回一个SqlDataReader对象,可以通过这个对象来检查查询结果,它提供了只进只读的执行方式,即从结果中读取 ...
- 【读书笔记】深入应用C++11代码优化与工业级应用 读书笔记01
第一章 使用C++11让程序更简洁.更现代 1.1 类型推导 1.1.1 auto类型推导 1.auto关键字的新意义 不同于python等动态类型语言的运行时进行变量类型的推导,隐式类型定义的类 ...
- [leetcode]17. Letter Combinations of a Phone Number手机键盘的字母组合
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that th ...
- Error running Tomcat8: Address localhost:xxxx is already in use
参考自: https://blog.csdn.net/huazhongkejidaxuezpp/article/details/41813683 第一步,命令提示符号,执行命令:netstat -an ...
- linearlayout 中ImageView 居中等问题
linearlayout 下的子控件使用android:layout_gravity=”center” 控件居左,没有达到居中的效果, 父窗体只能指定一种控件摆放方向 横向还是竖向 下面我弄了三个 ...
- 模板学习实践三 functor
#include <iostream>#include <typeinfo> void foo(){ std::cout << "foo() called ...
- mui.fire()触发自定义事件
导读:添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,通过mui.fire()方法可触发目标窗口的自定义事件. 监听自定义事件 添加自定义事件监听操作和标准js事件监听类 ...