CF1042E Vasya and Magic Matrix 题解
思路分析
看到题目中 \(n,m \leq 1000\) ,故直接考虑 \(O(n^2)\) 级别做法。
我们先把所有的点按照 \(val\) 值从小到大排序,这样的话二维问题变成序列问题。
设 \(f_i\) 表示走到第 \(i\) 个点的价值的期望。
先列出裸的 \(dp\) 方程:(\(Num\) 表示符合条件的点的个数)
\]
但是这个好像是 \(O(n^2m^2)\) 的优秀算法……
不要担心,我们把式子化简一下:
f_i=\frac{1}{Num}\sum_{a_i>a_j}x_i^2+x_j^2+y_i^2+y_j^2+2(x_ix_j+y_iy_j)+f_j
\]
我们惊喜地发现,可以用前缀和优化。
设:
- \(suma_i=\sum_{j=1}^ia_j\quad sumb_i=\sum_{j=1}^ib_j\)
- \(sumpa_i=\sum_{j=1}^ia_j^2 \quad sumpb_i=\sum_{j=1}^ib_j^2\)
- \(sumf_i=\sum_{j=1}^if_j\)
直接按照上述前缀和替换即可,在这里不写了。
Code
#include <bits/stdc++.h>
#define file(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
#define Enter putchar('\n')
#define quad putchar(' ')
#define int long long
#define N 1005
#define mod 998244353
int n, m, a[N][N], tot, x, y, f[N * N], sumf[N * N];
int suma[N * N], sumb[N * N], sumpa[N * N], sumpb[N * N];
struct Node {
int x, y, num;
friend bool operator <(const Node &p, const Node &q) {
return p.num < q.num;
}
}node[N * N];
inline int ksm (int a, int n) {
int ret = 1;
while (n) {
if (n % 2 == 1) ret = (ret * a) % mod;
a = (a * a) % mod;
n /= 2;
}
return ret;
}
inline void init() {
for (int i = 1; i <= tot; i++) {
sumpa[i] = (sumpa[i - 1] + node[i].x * node[i].x) % mod;
sumpb[i] = (sumpb[i - 1] + node[i].y * node[i].y) % mod;
suma[i] = (suma[i - 1] + node[i].x) % mod;
sumb[i] = (sumb[i - 1] + node[i].y) % mod;
}
return ;
}
inline void solve(int pos, int id) {
// std::cout << pos << " " << id << std::endl;
f[pos] = (f[pos] + sumpa[id] + sumpb[id]) % mod;
f[pos] = f[pos] - 2 * node[pos].x * suma[id] - 2 * node[pos].y * sumb[id];
f[pos] = (f[pos] % mod + mod) % mod;
int px = node[pos].x * node[pos].x;
int py = node[pos].y * node[pos].y;
f[pos] = (f[pos] + id * px + id * py) % mod;
f[pos] = (f[pos] + sumf[id]) % mod;
f[pos] *= ksm(id, mod - 2); f[pos] %= mod;
sumf[pos] = (sumf[pos - 1] + f[pos]) % mod;
return ;
}
signed main(void) {
std::cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &a[i][j]);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
node[++tot].x = i;
node[tot].y = j;
node[tot].num = a[i][j];
}
}
std::cin >> x >> y;
std::sort(node + 1, node + 1 + tot);
init();
int last;
node[0].num = -114514;
for (int i = 1; i <= tot; i++) {
if (node[i].num != node[i - 1].num) last = i - 1;
solve(i, last);
if (node[i].x == x && node[i].y == y) {
std::cout << f[i] << std::endl;
return 0;
}
}
}
CF1042E Vasya and Magic Matrix 题解的更多相关文章
- CF1042E Vasya and Magic Matrix
感觉不会期望. 首先把所有格子按照权值从小到大排一下序,这样一共有$n * m$个元素,每个元素有三个属性$x, y, val$. 下文中的下标均为排序后的下标. 这样子我们就可以推出公式: $f_i ...
- CF 1042 E. Vasya and Magic Matrix
E. Vasya and Magic Matrix http://codeforces.com/contest/1042/problem/E 题意: 一个n*m的矩阵,每个位置有一个元素,给定一个起点 ...
- Vasya and Magic Matrix CodeForces - 1042E (概率dp)
大意:给定n*m矩阵, 初始位置(r,c), 每一步随机移动到权值小于当前点的位置, 得分为移动距离的平方, 求得分期望. 直接暴力dp的话复杂度是O(n^4), 把距离平方拆开化简一下, 可以O(n ...
- Educational Codeforces Round 9 F. Magic Matrix 最小生成树
F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...
- Educational Codeforces Round 48 (Rated for Div. 2) D 1016D Vasya And The Matrix (构造)
D. Vasya And The Matrix time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- codeforces1016 D. Vasya And The Matrix(思维+神奇构造)
D. Vasya And The Matrix time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Codeforces 632F Magic Matrix(bitset)
题目链接 Magic Matrix 考虑第三个条件,如果不符合的话说明$a[i][k] < a[i][j]$ 或 $a[j][k] < a[i][j]$ 于是我们把所有的$(a[i][j ...
- D. Vasya And The Matrix(Educational Codeforces Round 48)
D. Vasya And The Matrix time limit per test2 seconds memory limit per test256 megabytes inputstandar ...
- Vasya And The Matrix CodeForces - 1016D (思维+构造)
Now Vasya is taking an exam in mathematics. In order to get a good mark, Vasya needs to guess the ma ...
随机推荐
- python基础练习题(题目 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数)
day10 --------------------------------------------------------------- 实例017:字符串构成 题目 输入一行字符,分别统计出其中英 ...
- 推荐系统 TOP K 评价指标
目录 符号说明 示例数据 一.Hit Rate 二.Recall 三.NDCG 符号说明 \(top\_k\): 当前用户预测分最高的k个items,预测分由高到低排序 $pos$: 当前用户实际点击 ...
- DH问题汇总
本节内容主要转载于:弄清楚DL,D-H,CDH problem,CDH assumption,DDH,BDDH,BCDH. DLP(Discrete Logarithm Problem) 在乘法群\( ...
- 逆向进阶,利用 AST 技术还原 JavaScript 混淆代码
什么是 AST AST(Abstract Syntax Tree),中文抽象语法树,简称语法树(Syntax Tree),是源代码的抽象语法结构的树状表现形式,树上的每个节点都表示源代码中的一种结构. ...
- 第一个MVC程序
配置版 添加web的支持! 确定导入了SpringMVC 的依赖! 配置web.xml , 注册DispatcherServlet <?xml version="1.0" e ...
- hashib加密模块、logging模块
hashib加密模块 # 加密模块 1.什么是加密 将明文的数据通过一些手段变成能密文数据 密文数据的表现形式一般都是一串没有规则的字符串 2.加密算法 加密算法有很多>>>(讲文明 ...
- 探索ABP基础架构
为了了解应用程序是如何配置和初始化,本文将探讨ASP.NET Core和ABP框架最基本的构建模块.我们将从 ASP.NET Core 的 Startup类开始了解为什么我们需要模块化系统,以及 AB ...
- MongoDB是什么?非关系型数据库的优点?安装使用教程
哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,由于球姐都有孩子了, ...
- CSAPP 之 CacheLab 详解
前言 本篇博客将会介绍 CSAPP 之 CacheLab 的解题过程,分为 Part A 和 Part B 两个部分,其中 Part A 要求使用代码模拟一个高速缓存存储器,Part B 要求优化矩阵 ...
- Java类包
学习内容:Java类包 一.Java类包 1.一个完整的类名需要包名和类名的组合,每一个类都隶属于一个包. 例:完整类名--java.sql.Date 2.同一个包中类相互访问时可以不指明包名. 3. ...