Description

小Yuuka遇到了一个题目:有一个序列a_1,a_2,?,a_n,q次操作,每次把一个区间内的数改成区间内的最大值,问

最后每个数是多少。小Yuuka很快地就使用了线段树解决了这个问题。于是充满智慧的小Yuuka想,如果操作是随机

的,即在这q次操作中每次等概率随机地选择一个区间l,r,然后将这个区间内的数改成区间内最大

值(注意这样的区间共有(n(n+1))/2个),最后每个数的期望大小是多少呢?小Yuuka非常热爱随机,所以她给出

的输入序列也是随机的(随机方式见数据规模和约定)。对于每个数,输出它的期望乘((n(n+1))/2)q再对109+7取模的值。

Solution

考虑每一个位置最后会变成的值,这个不好算

考虑每一个位置作为最大值可以影响到的范围

枚举每一个点作为最大值 \(x\), \(DP\) 算贡献

设 \(f[k][i][j]\) 表示前 \(k\) 次操作, \([i,j]\) 的最大值小于等于 \(x\) 的方案数

\(i-1\),\(j+1\) 比区间最大值大的,每次选的区间包含这两个位置就会缩短区间,否则不变

分区间长度缩短和不变两种写就好了

最后求出的是小于等于 \(x\) 的方案数,容斥一下得到等于 \(x\) 的方案数

随机数据下,复杂度期望 \(O(q*n^2)\)

#include<bits/stdc++.h>
#define RG register
using namespace std;
const int N=405,mod=1e9+7;
int n,m,a[N],g[N],b[N],f[2][N][N],s[N][N];
inline void add(int &x,int y){x+=y;if(x>=mod)x-=mod;}
inline void solve(int l,int r,int p){
for(int i=l;i<=r;i++)
for(int j=l;j<=r;j++)f[0][i][j]=f[1][i][j]=0;
bool t=0;
f[0][l][r]=1;
for(int P=1;P<=m;P++,t^=1){
for(int i=l;i<=r;i++){
int sum=0;
for(RG int j=r;j>=i;j--){
int w=f[t][i][j];
add(f[t^1][i][j],sum);
sum=(sum+1ll*w*(n-j))%mod;
}
}
for(int j=l;j<=r;j++){
int sum=0;
for(RG int i=l;i<=j;i++){
int w=f[t][i][j];f[t][i][j]=0;
add(f[t^1][i][j],sum);
add(f[t^1][i][j],1ll*w*(1ll*g[i-1]+g[j-i+1]+g[n-j])%mod);
sum=(sum+1ll*w*(i-1))%mod;
}
}
}
for(int i=l;i<=r;i++)
for(int j=i;j<=r;j++)
if(f[t][i][j])
for(RG int k=i;k<=j;k++)s[k][a[p]]=(s[k][a[p]]+f[t][i][j])%mod;
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%d",&a[i]),g[i]=i*(i+1)>>1,b[i]=a[i];
sort(b+1,b+n+1);
int tp=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+tp+1,a[i])-b;
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(l,r,i);
}
for(int i=1;i<=n;i++){
int ans=0;
for(int j=1;j<=tp;j++)
if(s[i][j]){
for(int k=1;k<j;k++)s[i][j]=(s[i][j]-s[i][k]+mod)%mod;
ans=(ans+1ll*b[j]*s[i][j])%mod;
}
printf("%d ",ans);
}
return 0;
}

bzoj 4574: [Zjoi2016]线段树的更多相关文章

  1. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  2. [BZOJ 4025]二分图(线段树分治+带边权并查集)

    [BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...

  3. 【BZOJ 3476】 线段树===

    59  懒惰的奶牛贝西所在的牧场,散落着 N 堆牧草,其中第 i 堆牧草在 ( Xi,Yi ) 的位置,数量有 Ai 个单位.贝西从家移动到某一堆牧草的时候,只能沿坐标轴朝正北.正东.正西.正南这四个 ...

  4. Luogu P1198 BZOJ 1012 最大数 (线段树)

    手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/article/details/77449455 URL: (Lu ...

  5. bzoj 3585 mex - 线段树 - 分块 - 莫队算法

    Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...

  6. BZOJ 4025: 二分图 [线段树CDQ分治 并查集]

    4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...

  7. BZOJ.3585.mex(线段树)

    题目链接 题意:多次求区间\(mex\). 考虑\([1,i]\)的\(mex[i]\),显然是单调的 而对于\([l,r]\)与\([l+1,r]\),如果\(nxt[a[l]]>r\),那么 ...

  8. bzoj 4025 二分图——线段树分治+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...

  9. 【BZOJ 1018】线段树 **

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3242  Solved: 1084[Submi ...

随机推荐

  1. sqlServer sa用户登陆失败的解决办法

    sqlserver sa用户登陆失败的解决办法 如下图以此模仿: 1.右键-属性 2.找到安全: 3.勾选如图: 4.sa用户密码重置: 5.服务重启:

  2. Jmeter_远程启动

    Jmeter 是Java 应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误. 其实,Jmeter的 ...

  3. query flot 直方图上显示对应的y值

    方法1:使用在图上加 相对定位的 div 提示对应的直方图数量. 具体实现:获取直方图上所有的点,得到y值和对应的坐标位置,插入相对div 主要js代码:plot 为对应的图对象 //初始化柱状图数据 ...

  4. Win7下C/C++跨平台开发工具IDE的安装之CodeBlocks

    1. Win7下安装CodeBlocks: 下载带有mingw的CodeBlocks:http://www.codeblocks.org/downloads/26#windows 运行所下载程序: 点 ...

  5. OpenStack-Mitaka

    一.Cloud 基础概念 IAAS:Infrastructre As A Service 基础架构及服务,OpenStack,CloudStack PAAS:Platform As A Service ...

  6. Spring学习笔记(六)—— SSH整合

    一.整合原理 二.整合步骤 2.1 导包 [hibernate] hibernate/lib/required hibernate/lib/jpa 数据库驱动 [struts2] struts-bla ...

  7. 蠕虫Worm virus

    美国CORNELL大学研究生莫里斯编写的蠕虫病毒 蠕虫病毒是一种常见的计算机病毒.它是利用网络进行复制和传播,传染途径是通过网络和电子邮件.最初的蠕虫病毒定义是因为在DOS环境下,病毒发作时会在屏幕上 ...

  8. windows cmd 切换磁盘

    抛砖引玉 切换到D盘根目录——cd /d D: 切换到D:\dev目录——cd  /d  D:\dev

  9. once函数,简约不简单的

    module.exports = once once.proto = once(function () { Object.defineProperty(Function.prototype, 'onc ...

  10. 青蛙的约会----POJ1061

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 133905   Accepted: 29707 Descript ...