bzoj 4574: [Zjoi2016]线段树
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]线段树的更多相关文章
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
- 【BZOJ 3476】 线段树===
59 懒惰的奶牛贝西所在的牧场,散落着 N 堆牧草,其中第 i 堆牧草在 ( Xi,Yi ) 的位置,数量有 Ai 个单位.贝西从家移动到某一堆牧草的时候,只能沿坐标轴朝正北.正东.正西.正南这四个 ...
- Luogu P1198 BZOJ 1012 最大数 (线段树)
手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/article/details/77449455 URL: (Lu ...
- bzoj 3585 mex - 线段树 - 分块 - 莫队算法
Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...
- BZOJ 4025: 二分图 [线段树CDQ分治 并查集]
4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...
- BZOJ.3585.mex(线段树)
题目链接 题意:多次求区间\(mex\). 考虑\([1,i]\)的\(mex[i]\),显然是单调的 而对于\([l,r]\)与\([l+1,r]\),如果\(nxt[a[l]]>r\),那么 ...
- bzoj 4025 二分图——线段树分治+LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...
- 【BZOJ 1018】线段树 **
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3242 Solved: 1084[Submi ...
随机推荐
- git you need to resolve your current index first 解决办法
当使用git checkout 切换分支时会提示you need to resolve your current index first,使用如下命令即可解决. $ git reset --merge
- 03process对象的其他方法属性
一 Process对象的join方法 在主进程运行过程中如果想并发地执行其他的任务,我们可以开启子进程,此时主进程的任务与子进程的任务分两种情况 情况一:在主进程的任务与子进程的任务彼此独立的情况下, ...
- rsync入门
rsync是Linux/unix下一个用于远程文件(目录)同步的一个精巧的小工具程序,有很多文章讨论了其功能和实现原理,本文主要就不赘述了. 主要介绍下实践时使用的一些方法和细枝末节留作工作笔记以便日 ...
- JDBC的概念&使用步骤
概念: JDBC(Java DataBase Connectivity)是一种数据库连接技术,能实现Java程序对各种数据库的访问.由一组使用Java语言编写的类和接口(JDBC API)组成,他们位 ...
- 《Andrew Ng深度学习》笔记4
浅层神经网络 1.激活函数 在神经网络中,激活函数有很多种,常用的有sigmoid()函数,tanh()函数,ReLu函数(修正单元函数),泄露ReLu(泄露修正单元函数).它们的图形如下: sigm ...
- NAND NOR Flash 和MTD
来自:http://blog.sina.com.cn/s/blog_6b489d5e0102xm62.html 一.NAND和NOR Flash 一般来说,快闪记忆体可分为两大规格,一个是NAND, ...
- 开启HTML5之旅。。。
学习大纲: 一.了解HTML 1.什么是HTML? HTML是用来描述网页的一种语言 HTML是一种超文本标记语言 Hyper Text Markap Language HTML不是一种编程语言,是一 ...
- Windows 环境 ABP前端运行 ng test 无法执行
Command: ng test Error Information: Schema validation failed with the following errors: Data path &q ...
- [水题AC乐] - 贪心
HDU - 1009 https://paste.ubuntu.com/p/rgSYpSKkwW/ POJ - 1017 麻烦的模拟 贪心 题意就是用尽量少的66h箱子装nnh的物品,贪心策略很明显, ...
- SPOJ - REPEATS RMQ循环节
题意:求重复次数最多的重复子串(并非长度最长) 枚举循环子串长度\(L\),求最多能连续出现多少次,相邻的节点往后的判断可以使用\(LCP\)得到值为\(K\),那么得到一个可能的解就是\(K/L+1 ...