题目链接:RMQ Similar Sequence

题意

首先给定一个长度为 nnn 的整数序列 A={a1,a2,⋯,an}" role="presentation" style="position: relative;">A={a1,a2,⋯,an}A={a1,a2,⋯,an}A=\{a_1,a_2,\cdots,a_n\},定义 RMQ{A,l,r}RMQ{A,l,r}RMQ\{A,l,r\} 表示查找区间 [l,r][l,r][l,r] 内的最大值的下标,如果存在多个最大值,则取最左边的数字的下标。现在要构造一个长度为 nnn 的序列 B={b1,b2,⋯,bn}" role="presentation" style="position: relative;">B={b1,b2,⋯,bn}B={b1,b2,⋯,bn}B=\{b_1,b_2,\cdots,b_n\},要求每个数字都是属于区间 [0,1][0,1][0,1] 内的实数,且对于每一个 RMQ{B,l,r}RMQ{B,l,r}RMQ\{B,l,r\},其询问结果都和 RMQ{A,l,r}RMQ{A,l,r}RMQ\{A,l,r\} 相同,问所有满足条件的序列 BBB 的 ∑i=1nbi" role="presentation" style="position: relative;">∑ni=1bi∑i=1nbi\sum_{i=1}^nb_i 的期望值。

输入

第一行为一个整数 TTT,接下去有 T" role="presentation" style="position: relative;">TTT 组数据,每组数据第一行为一个整数 n (1≤n≤106)n(1≤n≤106)n~(1\leq n\leq10^6),第二行为 nnn 个整数 a1,a2,⋯,an (1≤ai≤n)" role="presentation" style="position: relative;">a1,a2,⋯,an (1≤ai≤n)a1,a2,⋯,an (1≤ai≤n)a_1,a_2,\cdots,a_n~(1\leq a_i\leq n),数据保证所有 nnn 的和不超过 3×106" role="presentation" style="position: relative;">3×1063×1063\times10^6。

输出

输出期望对 109+7109+710^9+7 取模的结果,如果期望无法被 109+7109+710^9+7 整除,先化简期望为 pqpq\frac{p}{q},保证 ppp 和 q" role="presentation" style="position: relative;">qqq 互质且都为正整数的情况下,输出 a (0≤a≤109+6)a(0≤a≤109+6)a~(0\leq a\leq10^9+6) 的值,要求 p−aqp−aqp-aq 能够被 109+7109+710^9+7 整除。

样例

输入
3
3
1 2 3
3
1 2 1
5
1 2 3 2 1
输出
250000002
500000004
125000001

题解

根据题意建立一棵序列 AAA 的笛卡尔树,题目即求笛卡尔树与数列 A" role="presentation" style="position: relative;">AAA 同构的序列 BBB 的序列和的期望,由于 B" role="presentation" style="position: relative;">BBB 内每个数字都是实数,所以任意两个数字相等的概率趋近于 000,对于每一个节点对应的区间,节点的数字大于该区间内所有数字的概率为 1soni" role="presentation" style="position: relative;">1soni1soni\frac{1}{son_i},其中 sonisonison_i 为节点 iii 对应子树的节点数,将所有节点的满足条件的概率相乘,再乘上序列求和的期望值 n2" role="presentation" style="position: relative;">n2n2\frac{n}{2},就是答案。最后要求期望对 109+7109+710^9+7 的取模的结果,就是将结果 pqpq\frac{p}{q} 转化成 p×q−1mod109+7p×q−1mod109+7p\times q^{-1}\mod10^9+7。

过题代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
using namespace std;#define LL long long
const int maxn = 1000000 + 100;
const LL MOD = 1000000007;LL ans;
LL inv[maxn];struct Tree {int root, top, n;int sta[maxn], l[maxn], r[maxn];bool vis[maxn];void build(int *num, int nn) {n = nn;top = 0;memset(l, 0, sizeof(int) * (n + 1));memset(r, 0, sizeof(int) * (n + 1));memset(vis, 0, sizeof(bool) * (n + 1));for(int i = 1; i <= n; ++i) {int tmp = top;while(top > 0 && num[sta[top - 1]] < num[i]) {--top;}if(top != 0) {r[sta[top - 1]] = i;}if(top < tmp) {l[i] = sta[top];}sta[top++] = i;}for(int i = 1; i <= n; ++i) {vis[l[i]] = vis[r[i]] = true;}for(int i = 1; i <= n; ++i) {if(!vis[i]) {root = i;}}}int dfs(int x) {int cnt = 1;if(l[x] != 0) {cnt += dfs(l[x]);}if(r[x] != 0) {cnt += dfs(r[x]);}ans = (ans * inv[cnt]) % MOD;return cnt;}
};int T, n;
int num[maxn];
Tree t;void Init() {inv[1] = 1;for(int i = 2; i < maxn; ++i) {inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;}
}int main() {#ifdef Dmaxiyafreopen("test.txt", "r", stdin);#endif // Dmaxiyaios::sync_with_stdio(false);Init();scanf("%d", &T);while(T--) {scanf("%d", &n);ans = (n * inv[2]) % MOD;for(int i = 1; i <= n; ++i) {scanf("%d", &num[i]);}t.build(num, n);t.dfs(t.root);printf("%I64d\n", ans);}return 0;
}

HDU 6305 RMQ Similar Sequence(笛卡尔树)相关推荐

  1. HDU - 6305 RMQ Similar Sequence(笛卡尔树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...

  2. [HDU 6305]RMQ Similar Sequence

    HDU 6305 题解: 首先B数列一定是一个下标满足二叉搜索树,值满足大根堆的东西. 先考虑B数列满足这个条件的概率. 首先根的元素一定是A数列中最大的(第二关键字是下标最小),考虑B数列中对应的元 ...

  3. 牛客 - sequence(笛卡尔树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a 和数列 b ,求 题目分析:不算难的题目,对于每个 a[ i ] 求一下贡献然后维护最大值就好,具体思路就是,先找出每个 a[ i ] 左 ...

  4. hdu 6044 hdu 6305 笛卡尔树

    hdu6044 题意:给出每个点是某段区间的最大值,问构造一个1到n的排列,有多少种符合要求的. 做法:用笛卡尔树,如果对于一个序列,最大值可以把序列分成两段,左边一段和右边一段,然后在对这两段进行分 ...

  5. HDU 4125 Moles 笛卡尔树 + kmp

    题意:有n(1<=n<=600000)个鼹鼠挖洞,每个鼹鼠有给定权值,挖的洞是一颗二叉树(左边的鼹鼠权值都比当前鼹鼠小,右边的鼹鼠权值比当前鼹鼠大), 也要按照鼹鼠的出场顺序挖洞,在形成的 ...

  6. hdu6305(笛卡尔树/分治)

    这道需要注意到一点..就是如果询问的区间如果覆盖了最大数,那么rmq一定是确定的..故以这个最大数为分界,左右2个区间是完全独立的..因此就可以采用分治的做法去做..聪明的汪聚聚已经实现.. 然后dl ...

  7. HDU1506(天然的笛卡尔树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题意:给定一个统计直方图,n个矩形条,每个矩形条宽1,高0-10^9,求最大矩形面积. 分析:天然的 ...

  8. SGU155(笛卡尔树的构造)

    题目:http://acm.sgu.ru/problem.php?contest=0&problem=155 题意:给出每个点的两个值key和fix,且所有的key值和fix值都是不相同的,要 ...

  9. 【IOI2018】会议【笛卡尔树】【dp】【线段树】

    题意:长度为nnn的序列,qqq次询问,每次给定一个区间,钦定区间中的一个位置xxx,使得区间所有点 与xxx之间的最大值(含端点) 之和 最小,输出最小值. n,q≤7.5×105n,q\leq7. ...

最新文章

  1. 2022-2028年中国国学培训行业市场研究及前瞻分析报告
  2. ubuntu下vim的配置
  3. OpenCV读取视频文件的实例(附完整代码)
  4. php 新浪url,PHP URL函数详解
  5. unknown host www.baidu.com 解决方法
  6. java.lang.NoSuchMethodError示例
  7. mysql注入攻击getshell_[漏洞案例]thinkcmf 2.x从sql注入到getshell实战
  8. 仰望星空,脚踏实地 2016
  9. Tomcat: Error starting child 原因以及处理方法
  10. 海康监控如何设置STMP邮箱报警
  11. 软件开发人员如何自我学习?
  12. 打印大的打印机打印不出来
  13. 《文法俱乐部》读书笔记之分词--LG二进制
  14. 联想v360安装linux双系统,联想V360在WIN7下安装XP双系统完美运行攻略.doc
  15. Kubernetes 实战——部署基于 Redis 和 Docker 的留言簿
  16. 计算机上如何保存ico格式,PS怎么保存ico格式
  17. 咕咕的的复复读读机机 ccpc河南省赛
  18. 列维飞行的幂律意味着什么
  19. 如何站在成功人士的肩上成为一个真正的巨人————《赛马娘 Pretty Derby》评测
  20. 进制转换和函数的定义

热门文章

  1. 173:vue+openlayers:解决国内openstreetmap地图加载不出来的问题(代码示例)
  2. 网络营销工具:网上收集的30个常用SEO工具
  3. t3提示本地系统高于服务器,登录T3软件时,提示本地版本高于服务器已升级版本...
  4. 牛客社区论坛项目(二)
  5. 图灵的生物情结(上)——一个不走寻常路的化学反应
  6. Substance Painter问题
  7. SessionStorage如何存放对象
  8. 绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据
  9. kong的介绍与使用
  10. 【解决方案】解决ImportError: Library “GLU“ not found.问题