\(\mathcal{Descrtiption}\)

  给定 \(\{a_n\}\),现进行 \(m\) 次操作,每次操作随机一个区间 \([l,r]\),令其中元素全部变为区间最大值。对于每个 \(i\),求所有可能操作方案最终得到的 \(a_i\) 之和。答案模 \((10^9+7)\)。

  \(n,q\le400\)。

\(\mathcal{Solution}\)

  那什么我懒得写题解了就把草稿贴上来好了。(

\[f(i,l,r,x):=\text{the operating ways that after }i\text{-th operation,}\\
\forall i\in[l,r],a_i\le x \text{ and }a_{l-1},a_{r+1}>x.\\
f(i,l,r,x)=\left(\binom{l}{2}+\binom{r-l+2}{2}+\binom{n-r+1}{2}\right)f(i-1,l,r,x)\\
+\sum_{p<l}(p-1)f(i-1,p,r,x)+\sum_{r<p}(n-p)f(i-1,l,p,x).\\
\text{Thus, the answer for }i\text{ can be represented as }r_i\text{, where}\\
\begin{aligned}
r_i&=\sum_{x} x\sum_{[l,r]\ni i}f(q,l,r,x)-f(q,l,r,x-1)\\
&=\sum_{[l,r]\ni i}\sum_{x}-f(q,l,r,x)\\
&=\sum_{[l,r]\ni i}g(q,l,r)~~~~(g(i,l,r):=\sum_{x}-f(i,l,r,x)).
\end{aligned}\\
\text{Obviously, }g\text{'s expression is similar to }f\text{'s.}\\
\text{Maintaining partial sum, this problem can be solved in }\mathcal O(qn^2).
\]

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <bits/stdc++.h>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) const int MAXN = 400, MOD = 1e9 + 7, IINF = 0x3f3f3f3f;
int n, m, a[MAXN + 5];
int g[2][MAXN + 5][MAXN + 5], sum[MAXN + 5]; inline int tot( const int u ) { return ( u * ( u + 1ll ) >> 1 ) % MOD; }
inline int mul( const int u, const int v ) { return 1ll * u * v % MOD; }
inline int sub( int u, const int v ) { return ( u -= v ) < 0 ? u + MOD : u; }
inline int add( int u, const int v ) { return ( u += v ) < MOD ? u : u - MOD; } int main() {
scanf( "%d %d", &n, &m );
rep ( i, 1, n ) scanf( "%d", &a[i] );
a[0] = a[n + 1] = IINF; rep ( l, 1, n ) {
int mxv = a[l];
rep ( r, l, n ) {
mxv = mxv < a[r] ? a[r] : mxv;
int mnv = a[l - 1] < a[r + 1] ? a[l - 1] : a[r + 1];
if ( mnv > mxv ) g[0][l][r] = sub( mxv, mnv < IINF ? mnv : 0 );
}
} for ( int sta = 1, i = 1; i <= m; sta ^= 1, ++i ) {
memset( sum, 0, sizeof sum );
rep ( l, 1, n ) rep ( r, l, n ) {
g[sta][l][r] = add( sum[r], mul( add( add( tot( l - 1 ),
tot( r - l + 1 ) ), tot( n - r ) ), g[!sta][l][r] ) );
sum[r] = add( sum[r], mul( l - 1, g[!sta][l][r] ) );
}
memset( sum, 0, sizeof sum );
per ( r, n, 1 ) per ( l, r, 1 ) {
g[sta][l][r] = add( g[sta][l][r], sum[l] );
sum[l] = add( sum[l], mul( n - r, g[!sta][l][r] ) );
}
} rep ( i, 1, n ) {
int ans = 0;
rep ( l, 1, i ) rep ( r, i, n ) ans = add( ans, g[m & 1][l][r] );
printf( "%d%c", ans, i < n ? ' ' : '\n' );
}
return 0;
}

Solution -「ZJOI 2016」「洛谷 P3352」线段树的更多相关文章

  1. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  2. 洛谷P3374(线段树)(询问区间和,支持单点修改)

    洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...

  3. 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)

    题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...

  4. 洛谷P5280 [ZJOI2019]线段树 [线段树,DP]

    传送门 无限Orz \(\color{black}S\color{red}{ooke}\)-- 思路 显然我们不能按照题意来每次复制一遍,而多半是在一棵线段树上瞎搞. 然后我们可以从\(modify\ ...

  5. 洛谷.T21778.过年(线段树 扫描线)

    题目链接或者这吧.. 被数据坑了 /* 操作按左端点排个序 依次进行即可 不是很懂 为什么不写Build 而在Add时改mp[rt]=p 会WA(too short on line 251..) 找到 ...

  6. 【洛谷】【线段树+位运算】P2574 XOR的艺术

    [题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...

  7. 【洛谷】【线段树】P1471 方差

    [题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...

  8. 【洛谷】【线段树】P1047 校门外的树

    [题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...

  9. 【洛谷】【线段树】P1886 滑动窗口

    [题目描述:] 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. [输入格式:] 输入一共 ...

随机推荐

  1. MySQL 截取小数位数

    项目中遇到一些有关小数位数截取的问题,留下痕迹,以便后续使用时注意:个人推荐使用方法2),直接四舍五入 1)select FORMAT(1478568.2457,2): 查询出来的结果为: ,每隔3位 ...

  2. 使用.NET 6开发TodoList应用(23)——实现请求限流

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 Rate Limiting允许保护我们的API服务免受过多请求的连接导致的性能下降,如果请求次数超过了限制,API服务端将会拒 ...

  3. Maven+ajax+SSM实现查询

    2.尚硅谷_SSM高级整合_使用ajax操作实现页面的查询功能 16.尚硅谷_SSM高级整合_查询_返回分页的json数据.avi 在上一章节的操作中我们是将PageInfo对象存储在request域 ...

  4. HDU 2084 数塔 (动态规划DP)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 题目分析:此题采用动态规划自底向上计算,如果我们要知道所走之和最大,那么最后一步肯定是走最后一排 ...

  5. Android 12(S) 图形显示系统 - 示例应用(二)

    1 前言 为了更深刻的理解Android图形系统抽象的概念和BufferQueue的工作机制,这篇文章我们将从Native Level入手,基于Android图形系统API写作一个简单的图形处理小程序 ...

  6. Mysql 死锁分析

    1. 结论 死锁检查机制 当事务A需要获取一个行锁时(例如更新一行数据),假如需要获取行1的锁 检查其他事务有没有已获取了行1的锁. 如果有,例如事务B已获取了行1的锁. 继续检查事务B在等待的锁,如 ...

  7. update(修改,DML语句) 和 delete(删除数据,DML语句)

    7.7.修改update(DML) 语法格式: update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3....where 条件; 注意:没有条件限制会导致所有数据全部更新 upda ...

  8. java 坐标练习

    定义一个三维空间的点,有三个坐标 实现以下目标: 1.可以生成特定坐标的点对象 2.提供可以设置三个坐标的方法 3.提供可以计算该点到特定点距离的平方的方法 class Point { double ...

  9. python函数关键字实参传参

    #!/usr/bin/python #coding=utf-8 #好好学习,天天向上 def describe_pet(type,name): print(f"i have a {type} ...

  10. python 中 *args he **kwargs的区别

    ''' 一 *args 和 **kwargs 的区别? *args 表示任意个 无名参数, 类型是元祖 tuple. **kwargs 表示的是关键字的参数 传入的参数是 dict 类型. 当*和** ...