Solution -「ZJOI 2016」「洛谷 P3352」线段树
\(\mathcal{Descrtiption}\)
给定 \(\{a_n\}\),现进行 \(m\) 次操作,每次操作随机一个区间 \([l,r]\),令其中元素全部变为区间最大值。对于每个 \(i\),求所有可能操作方案最终得到的 \(a_i\) 之和。答案模 \((10^9+7)\)。
\(n,q\le400\)。
\(\mathcal{Solution}\)
那什么我懒得写题解了就把草稿贴上来好了。(
\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」线段树的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P3374(线段树)(询问区间和,支持单点修改)
洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...
- 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)
题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...
- 洛谷P5280 [ZJOI2019]线段树 [线段树,DP]
传送门 无限Orz \(\color{black}S\color{red}{ooke}\)-- 思路 显然我们不能按照题意来每次复制一遍,而多半是在一棵线段树上瞎搞. 然后我们可以从\(modify\ ...
- 洛谷.T21778.过年(线段树 扫描线)
题目链接或者这吧.. 被数据坑了 /* 操作按左端点排个序 依次进行即可 不是很懂 为什么不写Build 而在Add时改mp[rt]=p 会WA(too short on line 251..) 找到 ...
- 【洛谷】【线段树+位运算】P2574 XOR的艺术
[题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...
- 【洛谷】【线段树】P1471 方差
[题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...
- 【洛谷】【线段树】P1047 校门外的树
[题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...
- 【洛谷】【线段树】P1886 滑动窗口
[题目描述:] 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. [输入格式:] 输入一共 ...
随机推荐
- Ant <Delete> 如何只删掉文件夹下所有文件和文件夹
用 fileset 来过滤要删掉的目录和文件 <project name="ant-project" default="example"> < ...
- c# - 接口的写法与基本调用
1.前言 接口与Java基本一样 2.操作 (1)看路径结果 (2) 接口源码: namespace ConsoleApp1 { public interface ILogin { void Eat( ...
- JavaWeb中Cookie会话管理,理解Http无状态处理机制
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512995108961387015/ 1.<Servlet简单实现开发部署过程> 2.<Serv ...
- Typora图床
Typora图床 Typora+PicGo+Gitee(码云)实现高效Markdown图床 typora是我最早接触的markdown格式的轻文本编辑器,因为我是计算机专业,所以平常记笔记会有代码块, ...
- 备忘录——基于rdlc报表实现打印产品标签
目录 0. 背景说明 1. 条形码生成 2. 获取产品的小程序码 3. 报表设计器设计标签模版 3.1 为WinForm控件工具箱添加ReportViewer控件 3.2 为VS2019安装RDLC报 ...
- Solon Web 开发,五、数据访问、事务与缓存应用
Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...
- 从带Per-Building数据的KML/COLLADA中创建3D Tiles
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 许多Cesium的使用者经常需要将整个城市的数十万个三维建筑可视 ...
- 146_LRU cache | LRU缓存设计
题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...
- 使用Xamarin开发移动应用示例——数独游戏(二)创建游戏界面
在本系列第一部分,我们创建了程序框架,现在我们创建游戏的界面,项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 首先在View ...
- new实例化和反射实例化有什么区别?
在工厂设计模式中,使用反射实例化,子类可以随便增加,工厂类不需要做任何的修改 使用反射之后最大的好处就是解耦合