题目链接:

http://www.lydsy.com/JudgeOnline/problem.php?id=4574

http://uoj.ac/problem/196


考虑数字随机并且值域够大,我们将元素离散化并且不需要去重。

令$g[i]$表示每一个位置的期望大小。

那么${Ans=\sum (g[i]*(\frac{n(n+1))}{2})^{q})}$

考虑根据这个${(\frac{n(n+1))}{2})^{q}}$转换一下问题,是不是可以变成:

---------------------------------------------分割线----------------------------------------------------------------

令${sum[i][j]}$表示序列的第$i$个位置的元素在$q$次操作后变成了离散化之后$j$大的方案数。

那么${Ans=\sum_{i=1}^{n}\sum _{j=1}^{n}(sum[i][j]*X[j])}$    //$X[i]$表示第离散化之后的第$i$个元素原本对应的数字的大小。

---------------------------------------------分割线----------------------------------------------------------------

考虑如何求${sum}$数组。

从左至右枚举离散化数列每一位上的值(设我枚举的数字为第${E}$大),我们知道一个数至多能够影响到一个有限的区间,即区间${[L,R]}$中每一个数字都没有它大。

令${DP[k][i][j]}$表示第$k$次操作之后区间${[i,j]}$的值都小于等于当前枚举值的方案数。

转移:

${DP[k][i][j]=\sum _{u=L}^{i-1}(DP[k-1][u][j]*(u-1))+\sum _{v=j+1}^{R}(DP[k-1][i][v]*(n-v))+DP[k-1][i][j]*(cnt[i-1]+cnt[j-i+1]+cnt[n-j])}$

那么为啥是这样呢?

我来尝试解释一下第一项即${\sum _{u=L}^{i-1}(DP[k-1][u][j]*(u-1))}$

  这个转移其实是从区间${[U,j]}$转移到区间${[i,j]}$,拿为啥要乘上一个系数$(u-1)$,是因为我要使得${[u,i-1]}$这段区间内不再小于等于当前枚举的值。所以只要选取了${[1,u-1]}$这段区间内的一个元素作为操作的左端点,固定右端点为${i-1}$则一定会存在一个数字(因为第${L-1}$个数一定大于当前枚举的数)使得${[u,i-1]}$这个区间的数不再小于等于当前枚举的数。

第二项的理解和第一项基本相同。

第三项就比较简单了,如果我选取的区间不跨过第$i$个位置或第$j$个位置,那就不会产生状态的改变,可与之间从区间${[i,j]}$向区间${[i,j]}$转移

对于每一个枚举的数字就算出了$DP$数组,我为了方便统计答案再设一个数组${sum{}'}$表示序列的第$i$个位置的元素在$q$次操作后变成了离散化之后数小于等于$j$大数的方案数。

${sum{}'[i][E]=sum{}'[i][E]+\sum _{u=L}^{R-1}\sum _{v=u+1}^{R}DP[q][u][v]}$

最后在利用${sum{}'}$数组计算出${sum}$数组。

${Ans=\sum_{i=1}^{n}\sum _{j=1}^{n}(sum[i][j]*X[j])}$

参考:http://blog.csdn.net/qq_34637390/article/details/51290087


  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<cstring>
  8. using namespace std;
  9. #define maxn 410
  10. #define llg long long
  11. #define md (llg)((1e9)+7)
  12. #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  13. #define DD(i,j,k) dp[(i)%2][j][k]//方便滚动数组优化空间
  14. llg n,m,q,x[maxn],rank[maxn],L,R,wz[maxn];
  15. llg cnt[maxn],dp[][maxn][maxn],sum[maxn][maxn],A[maxn][maxn];
  16.  
  17. inline bool cmp(llg a,llg b) {return x[a]<x[b];}
  18.  
  19. void init()
  20. {
  21. cin>>n>>q;
  22. for (llg i=;i<=n;i++) scanf("%lld",&x[i]);
  23. for (llg i=;i<=n;i++) wz[i]=i;
  24. sort(wz+,wz+n+,cmp);
  25. for (llg i=;i<=n;i++) rank[wz[i]]=i;//第i个元素是第rank[i]小的
  26. //离散化
  27. for (llg i=;i<=n;i++) cnt[i]=(i*i+i)/;
  28. for(int i=;i<=n;i++)for(int j=i;j<=n;j++)A[i][j]=cnt[i-]+cnt[n-j]+cnt[j-i+];
  29. }
  30.  
  31. void DP(llg now)
  32. {
  33. for (llg i=L;i<=R;i++) for (llg j=L;j<=R;j++) DD(,i,j)=DD(,i,j)=;
  34. DD(,L,R)=;
  35. llg val;
  36. for (llg k=;k<=q;k++)
  37. {
  38. for (llg i=L;i<=R;i++)
  39. {
  40. val=;
  41. for(int j=R;j>=i;j--)
  42. {
  43. DD(k,i,j)=val; val=(val+DD(k-,i,j)*(n-j))%md;//计算第二项
  44. }
  45. }
  46. for (llg j=L;j<=R;j++)
  47. {
  48. val=;
  49. for(llg i=L;i<=j;i++)
  50. {
  51. DD(k,i,j)=(DD(k,i,j)+val)%md; val=(val+DD(k-,i,j)*(i-));//计算第一项
  52. }
  53. }
  54. for (llg i=L;i<=R;i++)
  55. {
  56. for (llg j=i;j<=R;j++)
  57. {
  58. DD(k,i,j)=(DD(k,i,j)+(DD(k-,i,j)*A[i][j]))%md;//计算第三项
  59. }
  60. }
  61. }
  62. for (llg i=L;i<=R;i++)
  63. {
  64. val=;
  65. for (llg j=R;j>=i;j--)
  66. {
  67. val+=DD(q,i,j); val%=md;
  68. sum[j][rank[now]]+=val;
  69. sum[j][rank[now]]%=md;
  70. }
  71. }
  72. }
  73.  
  74. int main()
  75. {
  76. //yyj("seg");
  77. init();
  78. for (llg i=;i<=n;i++)
  79. {
  80. L=R=i;
  81. while (L && x[L]<=x[i]) L--; L++;
  82. while (R<=n && x[R]<=x[i]) R++; R--;
  83. //预处理第i个元素可以影响的区间
  84. DP(i);
  85. }
  86.  
  87. llg ans=;
  88. for (llg i=;i<=n;i++)
  89. {
  90. ans=;
  91. for (llg j=;j<=n;j++)
  92. {
  93. if (sum[i][j]==) continue;
  94. for (llg k=;k<j;k++) sum[i][j]-=sum[i][k];
  95. while (sum[i][j]<) sum[i][j]+=md;
  96. ans+=x[wz[j]]*sum[i][j]; ans%=md;
  97. }
  98. while (ans<) ans+=md;
  99. printf("%lld",ans);
  100. if (i!=) printf(" ");
  101. }
  102. return ;
  103. }

【UOJ#196】【BZOJ4574】[Zjoi2016]线段树的更多相关文章

  1. BZOJ4574 [Zjoi2016]线段树

    比较厉害的dp. 网上题解都是利用了随机的条件,用了一个$O(n^4)$的dp,这里简单说一下. 用f(x,i,l,r)表示经过前i轮操作,[l,r]的所有数<=x,且l-1和r+1都>x ...

  2. bzoj4574:Zjoi2016线段树 dp

    传送门 题解传送门 //Achen #include<algorithm> #include<iostream> #include<cstring> #includ ...

  3. bzoj 4574: [Zjoi2016]线段树

    Description 小Yuuka遇到了一个题目:有一个序列a_1,a_2,?,a_n,q次操作,每次把一个区间内的数改成区间内的最大值,问 最后每个数是多少.小Yuuka很快地就使用了线段树解决了 ...

  4. UOJ#196. 【ZJOI2016】线段树 概率期望,动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ196.html 题解 先离散化,设离散化后的值域为 $[0,m]$ . 首先把问题转化一下,变成:对于每一个位置 $i$ ...

  5. UOJ 217 奇怪的线段树

    http://uoj.ac/problem/217 题意就不X了,思路在这: 居然一开始把sap里面的mn设置为inf了,我是傻逼.. #include<cstdio> #include& ...

  6. Luogu3352 ZJOI2016 线段树 概率、区间DP

    传送门 考虑对于每一个位置\(i\),计算所有可能的结果出现的概率. 定义一个区间\([l,r]\)为对于\(x\)的极大区间,当且仅当\(\max \limits _{i=l}^r \{a_i\} ...

  7. UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]

    UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...

  8. [UOJ UNR#1]奇怪的线段树

    来自FallDream的博客,未经允许,请勿转载, 谢谢. 原题可以到UOJ看,传送门 如果存在一个点是白的,却有儿子是黑的,显然无解. 不然的话,只要所有黑色的“黑叶子”节点,即没有黑色的儿子的节点 ...

  9. UOJ#395. 【NOI2018】你的名字 字符串,SAM,线段树合并

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ395.html 题解 记得同步赛的时候这题我爆0了,最暴力的暴力都没调出来. 首先我们看看 68 分怎么做 ...

随机推荐

  1. java之定时任务

    package com.financial.server.util; import java.text.SimpleDateFormat; import java.util.Date; import ...

  2. vue angular 分别实现分页

    1 vue实现分页组件 paginate组件 <template> <div class="pagination-wrap" v-cloak v-if=" ...

  3. The Little Prince-11/28

    The Little Prince-11/28 Today I find some beautiful words from the book. You know -- one loves the s ...

  4. airtest 记录

    from airtest.core.api import * # 通过ADB连接本地Android设备 connect_device("Android:///") #安装待测软件a ...

  5. oracle 12c AUTO_SAMPLE_SIZE动态采用工作机制

    The ESTIMATE_PERCENT parameter in DBMS_STATS.GATHER_*_STATS procedures controls the percentage of ro ...

  6. javaweb三大框架和MVC设计模式

    javaweb三大框架和MVC设计模式 转载,原文请见https://blog.csdn.net/sunpeng19960715/article/details/50890705 一.MVC设计模式 ...

  7. HihoCoder 1636 Pangu and Stones(区间DP)题解

    题意:合并石子,每次只能合并l~r堆成1堆,代价是新石堆石子个数,问最后能不能合成1堆,不能输出0,能输出最小代价 思路:dp[l][r][t]表示把l到r的石堆合并成t需要的最小代价. 当t == ...

  8. 【系列教程1】Gradle入门系列三:依赖管理

    在现实生活中,要创造一个没有任何外部依赖的应用程序并非不可能,但也是极具挑战的.这也是为什么依赖管理对于每个软件项目都是至关重要的一部分. 这篇教程主要讲述如何使用Gradle管理我们项目的依赖,我们 ...

  9. MPI 环境搭建问题-运行程序闪退

    安装后smpd无法运行,进程中没有smpd.exe.注册过程也完成了.运行自带的测试程序cpi.exe,提示:Error: No smpd passphrase specified through t ...

  10. 【创建模式】--Singleton

    设计模式之Singleton(单态) 单态定义: Singleton 模式主要作用是保证在Java应用程序中,一个类Class 只有一个实例存在. 在很多操作中,比如建立目录  数据库链接都需要这样的 ...