【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的题目但是总感觉好像并没有弄得比较明白啊..(我的妈果然蒟蒻) 这题的话可以说是难 ...
随机推荐
- Unity中的点击,长按,划动
public void GetClickType() { if(Input.GetMouseButtonDown(0)) { if(isGetBeginPos) { beginPosition = I ...
- Lock关键字
public abstract class CountBase { public abstract void Increment(); public abstract void Decreament( ...
- Windows驱动开发VS2012 DDK/WDK的环境配置
[开发Windows驱动的配置是很必要的,下文将详细介绍VS2012如何配置驱动开发环境] [转载] 以下部分内容是转载博客:http://blog.csdn.net/huangxy10/articl ...
- c++ 面试题(海量数据篇)
1,在海量数据中找中位数: 题目如下: 只有2G内存的pc机,在一个存有10G个整数的文件,从中找到中位数,写一个算法. 解答:http://www.cnblogs.com/youxin/archiv ...
- 258. Add Digits 入学考试:数位相加
[抄题]: Given a non-negative integer num, repeatedly add all its digits until the result has only one ...
- linux后台运行命令:&和nohup
常用后台运行命令包含:&和nohup 一.& 使用 当在前台运行某个作业时,终端被该作业占据:可以在命令后面加上& 实现后台运行.例如:sh test.sh & 适合在 ...
- [leetcode]1. Two Sum两数之和
Given an array of integers, return indices of the two numbers such that they add up to a specific t ...
- -bash: ls: No such file or directory 产生的原因及修改方法
ubuntu出现如下错误: { Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-42-generic x86_64) * Documentation: ...
- node.js中process进程的概念和child_process子进程模块的使用
进程,你可以把它理解成一个正在运行的程序.node.js中每个应用程序都是进程类的实例对象. node.js中有一个 process 全局对象,通过它我们可以获取,运行该程序的用户,环境变量等信息. ...
- Connection lost: The server closed the connection
想必很多初学者都会遇到这个问题 其实很简单.mysql有个机制,就是8小时无通信,myslq就会自动关闭数据; 解决方案(2选1): 或者: 1.定时去做一个查询,就是 select * from X ...