bzoj 4574: [Zjoi2016]线段树 动态规划
来源:互联网 发布:nginx set by lua 编辑:程序博客网 时间:2024/06/06 01:51
题意
小Yuuka遇到了一个题目:有一个序列a_1,a_2,?,a_n,q次操作,每次把一个区间内的数改成区间内的最大值,问最后每个数是多少。小Yuuka很快地就使用了线段树解决了这个问题。于是充满智慧的小Yuuka想,如果操作是随机的,即在这q次操作中每次等概率随机地选择一个区间l,r,然后将这个区间内的数改成区间内最大值(注意这样的区间共有(n(n+1))/2个),最后每个数的期望大小是多少呢?小Yuuka非常热爱随机,所以她给出的输入序列也是随机的(随机方式见数据规模和约定)。对于每个数,输出它的期望乘((n(n+1))/2)^q再对10^9+7取模的值。
n<=400,Q<=400
分析
数据随机说明了序列中的数是两两不相同的。
设
问题在于如何求
先枚举一个位置p,设其能拓展到的区间为
那么有
其中
为什么是这样呢?
考虑如何证明第二项。
因为
第三项证明同理。
为了方便求出
代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define dp(k,i,j) dp[(k)%2][i][j]using namespace std;typedef long long LL;const int N=405;const int MOD=1000000007;int n,m,rank[N],a[N],w[N];LL dp[2][N][N],sum[N][N],cnt[N],c[N][N];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;}void solve(int x,int L,int R){ for (int i=L;i<=R;i++) for (int j=i;j<=R;j++) dp(0,i,j)=dp(1,i,j)=0; dp(0,L,R)=1; for (int k=1;k<=m;k++) { for (int i=L;i<=R;i++) { LL t=0; for (int j=R;j>=i;j--) { dp(k,i,j)=t; t+=(LL)dp(k-1,i,j)*(n-j); } } for (int j=L;j<=R;j++) { LL t=0; for (int i=L;i<=j;i++) { (dp(k,i,j)+=t)%=MOD;; t+=(LL)dp(k-1,i,j)*(i-1); } } for (int i=L;i<=R;i++) for (int j=i;j<=R;j++) (dp(k,i,j)+=dp(k-1,i,j)*c[i][j])%=MOD; } for (int i=L;i<=R;i++) { LL t=0; for (int j=R;j>=i;j--) { t+=dp(m,i,j); (sum[j][rank[x]]+=t)%=MOD; } }}int main(){ n=read();m=read(); for (int i=1;i<=n;i++) a[i]=read(),w[i]=a[i],cnt[i]=cnt[i-1]+i; sort(w+1,w+n+1); for (int i=1;i<=n;i++) rank[i]=lower_bound(w+1,w+n+1,a[i])-w; for (int i=1;i<=n;i++) for (int j=i;j<=n;j++) c[i][j]=cnt[i-1]+cnt[n-j]+cnt[j-i+1]; for (int i=1;i<=n;i++) { int L=i,R=i; while (L>1&&a[L-1]<a[i]) L--; while (R<n&&a[R+1]<a[i]) R++; solve(i,L,R); } for (int i=1;i<=n;i++) { LL ans=0; for (int j=1;j<=n;j++) { if (!sum[i][j]) continue; for (int k=1;k<j;k++) sum[i][j]-=sum[i][k]; while (sum[i][j]<0) sum[i][j]+=MOD; (ans+=(LL)sum[i][j]*w[j])%=MOD; } printf("%lld",(ans+MOD)%MOD); if (i<n) putchar(' '); } return 0;}
阅读全文
0 0
- bzoj 4574: [Zjoi2016]线段树 动态规划
- bzoj 4574: [Zjoi2016]线段树 动态规划
- [DP] BZOJ 4574 [Zjoi2016]线段树
- BZOJ 4574: [Zjoi2016]线段树/UOJ #196. 【ZJOI2016】线段树 dp
- 4574 [Zjoi2016]线段树 dp
- bzoj4574: [Zjoi2016]线段树
- BZOJ4574: [Zjoi2016]线段树
- [ZJOI2016]线段树
- bzoj 2090: [Poi2010]Monotonicity 2 动态规划+线段树
- 【BZOJ4574】【Zjoi2016】线段树 dp
- [ZJOI2016]线段树 解题报告
- bzoj4574 [Zjoi2016]线段树 DP
- [bzoj4574][UOJ#196][ZJOI2016]线段树
- poj2750 线段树+动态规划
- POJ_1769_动态规划+线段树
- bzoj 4455: [Zjoi2016]小星星
- bzoj 4456: [Zjoi2016]旅行者
- BZOJ 4455: [Zjoi2016]小星星
- java实现二叉树,以及二叉树的遍历和先序和后序求解
- 编码格式简介:ASCII码、ANSI、GBK、GB2312、GB18030和Unicode、UTF-8,BOM头
- PATbasic1004
- 方向梯度直方图(HOG,Histogram of Gradient)
- 【Mybatis】——foreach使用方式
- bzoj 4574: [Zjoi2016]线段树 动态规划
- 石家庄一中游记(2017暑假)
- python+scrapy安装教程
- 1033:立方和不等式
- 感悟——写在研二初
- python
- 解析网络接口json串放入listview
- STL迭代器使用详解
- CNN 卷积神经网络