HDU 6305
题解:
首先B数列一定是一个下标满足二叉搜索树,值满足大根堆的东西。
先考虑B数列满足这个条件的概率。
首先根的元素一定是A数列中最大的(第二关键字是下标最小),考虑B数列中对应的元素。 这个元素是最大的概率是1n1n\frac1n, 递归的求解左右两个区间满足条件的概率乘起来就是B数列满足条件的概率。
最后在将概率和B数列的和的期望即n2n2\frac n2乘起来就行了。
对于求解区间最大值的位置可以使用线段树维护。
时间复杂度:O(nlogn)O(nlogn)O(nlogn)
代码:

#include<bits/stdc++.h>
#define LL long long
#define ull unsigned long long
#define ULL ull
#define mp make_pair
#define pii pair<int,int>
#define piii pair<int, pii >
#define pll pair <ll,ll>
#define pb push_back
#define big 20160116
#define INF 2147483647
#define pq priority_queue
#define rank rk124232
#define y1 y20160116
#define y0 y20160110
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
namespace Mymath{LL qp(LL x,LL p,LL mod){LL ans=1;while (p){if (p&1) ans=ans*x%mod;x=x*x%mod;p>>=1;}return ans;}LL inv(LL x,LL mod){return qp(x,mod-2,mod);}LL C(LL N,LL K,LL fact[],LL mod){return fact[N]*inv(fact[K],mod)%mod*inv(fact[N-K],mod)%mod;}template <typename Tp> Tp gcd(Tp A,Tp B){if (B==0) return A;return gcd(B,A%B);}template <typename Tp> Tp lcm(Tp A,Tp B){return A*B/gcd(A,B);}
};
namespace fwt{using namespace Mymath;void FWT(int a[],int n,LL mod){for(int d=1;d<n;d<<=1)for(int m=d<<1,i=0;i<n;i+=m)for(int j=0;j<d;j++){int x=a[i+j],y=a[i+j+d];a[i+j]=(x+y)%mod,a[i+j+d]=(x-y+mod)%mod;//xor:a[i+j]=x+y,a[i+j+d]=x-y;//and:a[i+j]=x+y;//or:a[i+j+d]=x+y;}}void UFWT(int a[],int n,LL mod){LL rev=inv(2,mod);for(int d=1;d<n;d<<=1)for(int m=d<<1,i=0;i<n;i+=m)for(int j=0;j<d;j++){int x=a[i+j],y=a[i+j+d];a[i+j]=1LL*(x+y)*rev%mod,a[i+j+d]=(1LL*(x-y)*rev%mod+mod)%mod;//xor:a[i+j]=(x+y)/2,a[i+j+d]=(x-y)/2;//and:a[i+j]=x-y;//or:a[i+j+d]=y-x;}}void solve(int a[],int b[],int n,LL mod){FWT(a,n,mod);FWT(b,n,mod);for(int i=0;i<n;i++) a[i]=1LL*a[i]*b[i]%mod;UFWT(a,n,mod);}
};
const int Maxn=1e6+5;
int n,a[Maxn];
int tree[Maxn*4],id[Maxn*4];
void build(int p,int l,int r){if (l==r){tree[p]=a[l];id[p]=l;return;}int mid=l+r>>1;build(p*2,l,mid);build(p*2+1,mid+1,r);tree[p]=max(tree[p*2],tree[p*2+1]);if (tree[p*2]==tree[p]){id[p]=id[p*2];}else{id[p]=id[p*2+1];}
}
pair<int,int> query(int p,int l,int r,int lo,int hi){if (lo<=l && r<=hi){return mp(tree[p],id[p]);}int mid=l+r>>1;if (lo<=mid && hi>mid){pair<int,int> lf=query(p*2,l,mid,lo,min(hi,mid));pair<int,int> rg=query(p*2+1,mid+1,r,max(lo,mid+1),hi);if (lf.first>=rg.first){return lf;}return rg;}if (lo<=mid){return query(p*2,l,mid,lo,min(hi,mid));}if (hi>mid){return query(p*2+1,mid+1,r,max(lo,mid+1),hi);}
}
LL ans;
using namespace Mymath;
const LL mod=1e9+7;
void solve(int l,int r){if (l>=r) return;pair<int,int> x=query(1,1,n,l,r);ans=ans*inv(r-l+1,mod)%mod;solve(l,x.second-1);solve(x.second+1,r);
}
void mian(){n=read();for (int i=1;i<=n;i++) a[i]=read();ans=(LL)n*inv(2,mod)%mod;build(1,1,n);solve(1,n);printf("%I64d\n",ans);
}
int main(){int t;t=read();while (t--){mian();}return 0;
}

[HDU 6305]RMQ Similar Sequence相关推荐

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

    题目链接:RMQ Similar Sequence 题意 首先给定一个长度为 nnn 的整数序列 A={a1,a2,⋯,an}" role="presentation" ...

  2. 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 ...

  3. HDU6305: RMQ Similar Sequence 题解

    Description Chiaki has a sequence A={a1,a2,-,an}. Let RMQ(A,l,r) be the minimum i (l≤i≤r) such that ...

  4. hdu 6044 hdu 6305 笛卡尔树

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

  5. 【HDU】1005 Number Sequence (有点可爱)

    http://acm.hdu.edu.cn/showproblem.php?pid=1005 A number sequence is defined as follows: f(1) = 1, f( ...

  6. hdu 5273 Dylans loves sequence 逆序数简单递推

    Dylans loves sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...

  7. hdu 5247(RMQ+枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247 解题思路:这道题要求区间的连续性,可以用RMQ解决.首先可以确定的是如果区间的和必须是满足等差数 ...

  8. hdu 5172(RMQ+前缀和)

    题意:判断一个区间[l,r]的数是否是1到(r-l+1). 解题思路:首先判断该区间内的和是否是n*(1+n)/2,这里可以用前缀和判断. 接下来是要判断该区间内无重复的数: pos[i]表示第i个数 ...

  9. hdu 3486(RMQ+高效枚举)

    题意:把n分为 均分为m 段 每段n/m个数字  每段可以选一个最大的数 求这些数相加起来>k的最小的m 解题思路:这道题本来想用二分+rmq的,但discuss里面说二分是错的,所以只能另想别 ...

最新文章

  1. Mysql游标循环遍历_MySQL数据库中,使用游标循环遍历
  2. 如何读取FoxPro(dbf)打删除标记的记录
  3. ubuntu php 源,Ubuntu18.04更换国内源
  4. 一段顺序颠倒能读通的文字_钓鱼也有逻辑顺序,总是钓不到鱼的原因就在这里...
  5. VS2008中文版MSDN订阅下载问题
  6. 你该学点HTML/CSS知识的9大理由
  7. 论文精读:车尧-《社会网络视角下战略性新兴产业的专利情报研究》
  8. 谷歌安装FeHelper插件
  9. PlaySound 播放内存中的音频数据
  10. VSTO 阿炯公文插件 wps/word 插件
  11. 项目常用的合同类型,特点及报价方式
  12. ubuntu恢复被rm误删的数据及原理
  13. php实现ctrl+f,Ctrl+F 到底有多好用?这 5 个骚操作,让你变身快捷键达人
  14. 【PTA~21年GPLT团体程序天梯赛-L1题】
  15. 用程序实现基本计算器功能
  16. 机器人莱克说明书_莱克扫地机器人—莱克扫地机器人的工作原理及分类
  17. mini2440 电源插座的问题
  18. jdbc连接mysql(基础)
  19. cs224d 作业 problem set1 (一) 主要是实现word2vector模型,SGD,CBOW,Softmax,算法
  20. 关于鸿蒙与凤蒙,鸿蒙天道

热门文章

  1. 史上最全的Git使用手册
  2. mysql数据库压缩图片_MySQL8.0.20压缩版本安装教程图片加文字详解
  3. 安装配置jdk--解压版
  4. SQL SERVER 2008 R2 清除数据库日志 sql语句
  5. Qt Tablewidget表格数据的导出和导入
  6. 数学建模——减肥模型Python实现
  7. 考研 计算机组成原理大纲,2020计算机组成原理考研大纲解析
  8. wmiprvse.exe 进程占CPU过高 问题解决
  9. SF14 | Supertrend“超级趋势线”指标魔改升级(源码)
  10. 第八课:受控源和放大器