正题

题目链接:https://www.luogu.com.cn/problem/P3352


题目大意

nnn个数字的一个序列,每次随机选择一个区间让这个区间所有数等于这个区间的最大值,重复qqq次,对每个位置求所有情况下这个位置的值的和。

1≤n,q≤4001\leq n,q\leq 4001≤n,q≤400,保证数据随机


解题思路

设fk,l,rf_{k,l,r}fk,l,r​表示使用了kkk次目前覆盖了极大区间l,rl,rl,r时的方案。

这个极大区间就是无法继续向左右扩展(就是左右两边是边界或者比这个区间内所有数都大),不然相同的方案会统计入不同的数组导致算重。

然后每次我们找一个数字开始向左右扩展到极大区间进行dpdpdp,然后dpdpdp方程是
fk,l,r=fk−1,l,r×gl,r+∑i=Ll−1fk−1,i,r+∑i=r+1Rfk−1,l,i+1f_{k,l,r}=f_{k-1,l,r}\times g_{l,r}+\sum_{i=L}^{l-1}f_{k-1,i,r}+\sum_{i=r+1}^{R}f_{k-1,l,i+1}fk,l,r​=fk−1,l,r​×gl,r​+i=L∑l−1​fk−1,i,r​+i=r+1∑R​fk−1,l,i+1​
也就是固定端点的情况下扩展极大区间,因为是反过来的所以这样是对的。

然后记录一个dpdpdp数组ansi,jans_{i,j}ansi,j​表示数字iii至少为第jjj小的情况数,这个每次dpdpdp后都可以统计。

上面每个dpdpdp区间相当于笛卡尔树上的区间,因为数据随机,所以每个位置只会计算logloglog次。

时间复杂度O(nq2+n3)O(nq^2+n^3)O(nq2+n3)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=410,P=1e9+7;
ll n,q,a[N],b[N],rk[N],f[2][N][N],ans[N][N],cnt[N];
void solve(ll x,ll L,ll R){for(ll i=L;i<=R;i++)for(ll j=i;j<=R;j++)f[0][i][j]=f[1][i][j]=0;f[0][L][R]=1;for(ll k=1;k<=q;k++){for(ll i=L;i<=R;i++)for(ll j=i;j<=R;j++)f[k&1][i][j]=f[~k&1][i][j]*(cnt[j-i+1]+cnt[i-1]+cnt[n-j]);for(ll i=L;i<=R;i++){ll buf=0;for(ll j=R;j>=i;j--){(f[k&1][i][j]+=buf)%=P;(buf+=f[~k&1][i][j]*(n-j))%=P;}}for(ll j=L;j<=R;j++){ll buf=0;for(ll i=L;i<=j;i++){(f[k&1][i][j]+=buf)%=P;(buf+=f[~k&1][i][j]*(i-1))%=P;}}}for(ll i=L;i<=R;i++){ll buf=0;for(ll j=R;j>=i;j--){(buf+=f[q&1][i][j])%=P;(ans[j][rk[x]]+=buf)%=P;}}return;
}
signed main()
{scanf("%lld%lld",&n,&q);for(ll i=1;i<=n;i++)cnt[i]=i*(i+1)/2; for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);b[i]=a[i];}sort(b+1,b+1+n);ll m=unique(b+1,b+1+n)-b-1;for(ll i=1;i<=n;i++)rk[i]=lower_bound(b+1,b+1+m,a[i])-b;for(ll i=1;i<=n;i++){ll 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(ll i=1;i<=n;i++){ll sum=0;for(ll j=1;j<=n;j++){if(!ans[i][j]){continue;}for(ll k=1;k<j;k++)(ans[i][j]+=P-ans[i][k])%=P;(sum+=ans[i][j]*b[j]%P)%=P;}printf("%lld ",sum);}return 0;
}

P3352-[ZJOI2016]线段树【dp】相关推荐

  1. 洛谷P3352 [ZJOI2016]线段树

    P3352 [ZJOI2016]线段树 (^ w ^) 题目描述 小Yuuka遇到了一个题目:有一个序列a_1,a_2,?,a_n,q次操作,每次把一个区间内的数改成区间内的最大值,问最后每个数是多少 ...

  2. P1295 [TJOI2011]书架(线段树dp)

    P1295 [TJOI2011]书架(线段树dp) 我好菜 先考虑普通dp: d p i = m i n ( d p j + m a x ( h j + 1 , h j + 2 - , h i ) ) ...

  3. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  4. CodeForces - 1557D Ezzat and Grid(线段树+dp)

    题目链接:点击查看 题目大意:给出 nnn 个 010101 串,现在问最少需要删掉多少个串,才能使得剩下的串拼起来是连通的 规定两个 010101 串是连通的,当且仅当存在至少一列,在两个串中都为 ...

  5. CodeForces - 487B Strip(线段树+dp+二分)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在要求分成尽可能少的子段,且每个子段需要满足: 最大值与最小值的差值小于等于 s 子段长度大于等于 l 题目分析:dp[ i ] 代表的是前 ...

  6. Educational Codeforces Round 81 (Rated for Div. 2) E. Permutation Separation 线段树 + dp

    传送门 文章目录 题意: 思路: 题意: 给你一个打乱的排列,每个位置都各有一个价值,让你选择一个分界点,分成p1,p2,...,prp_1,p_2,...,p_rp1​,p2​,...,pr​和pr ...

  7. Atcoder 077E - guruguru(线段树+dp)

    题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_c 分析:如果某条线段包含x,显然应该先按一下到x,再从x走,反之必然是直接走过去,很容易想到用d ...

  8. POJ1769(线段树+DP)

    飞翔 题意 : 给定一个区间长度 n ,接下来给出 m 个子区间,要求最少选出多少个区间才能使得 1~n 这个区间被所选的所有子区间覆盖 分析: 首先是动态规划,dp[i]表示把最大值从1位置搞到第i ...

  9. Codeforces 1398 F. Controversial Rounds —— 线段树+dp

    This way 题意: 给你一个字符串,有些位置是已知的,有些是未知的,从位置1开始,如果有连续的0或者1大于等于k个,那么就算一轮游戏,然后0,1重新计数.问你当k=1~n的时候,游戏轮数最多是多 ...

  10. HDU 6447 YJJ's Salesman(线段树+DP)

    YJJ's Salesman Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...

最新文章

  1. 一步一步搭架子(DM层与Service层)
  2. 修改JBOSS服务器的端口号
  3. SQL2005 express升级到2008企业版解决4096限制问题
  4. 大剑无锋之一句话输出表中每一个同学的成绩最高的课程【面试推荐】
  5. nginx proxy_pass末尾神奇的/
  6. 用户空间访问I2C设备驱动
  7. drools6.5_Drools 6.2.0.Final发布
  8. 主动断开socket链接_TCP连接与断开详解(socket通信)
  9. 基于 电子海图的海上搜救的研究
  10. android 3d桌面壁纸,五款超酷安卓手机3D桌面软件合辑推荐
  11. 百度网盘终于不限速了!?
  12. 计算机桌面全部内容自定义,电脑win10如何恢复自定义桌面图标排列的方法
  13. wakeonlangui 下载_远程开机软件(Wake On Lan)下载 v2.11.18 官方中文版 - 比克尔下载
  14. 关于fiddle开启https证书协议源码
  15. q87芯片组服务器主板,Intel 100系列芯片组详解:史上最良心!
  16. 在京东工作是一种什么体验
  17. This Week in Spring - December 24th, 2019
  18. android 微信高仿,Android 高仿微信发朋友圈浏览图片效果(转)
  19. 华为天猫官方旗舰店粉丝突破一千万
  20. 计算机网络教程 第6版

热门文章

  1. 增长率不用计算机,事业单位行测:这类资料分析题根本不用计算
  2. 苹果手机透明桌面_原来苹果手机辨别真假很容易!查看桌面1个图标,就能轻松分辨...
  3. 联想 android 5.1 root权限,联想A520手机ROOT权限图文教程(附联想A520root工具)
  4. etcd php,etcd集群备份和数据恢复
  5. c语言抬起按键,c语言获得键盘的按键
  6. usb接口定义引脚说明_PerfDogService使用说明
  7. JAVA中的GridView每一个赋值,在ASP.NET 2.0中操作数据之六十二:GridView批量更新数据...
  8. docker 容器启动顺序_Docker容器启动时初始化Mysql数据库
  9. [JavaWeb-XML]XML_快捷查询方式(selector选择器,XPath)
  10. [Java基础]比较器排序Comparator的使用