【CF 1195】Basketball Exercise/Submarine in the Rybinsk Sea (hard edition)/OpenStreetMap+二维单调队列滑动窗口模板

寡人认为C,E都是比较板的题
butD2也太ex了,大大是被那个mod精给弄疯了,我mod了那么多次还是炸了longlong orz
在这里插入图片描述

文章目录

  • 二维单调队列模板
  • C:Basketball Exercise
    • 题目大意
    • 题解
    • 代码实现
  • D2:Submarine in the Rybinsk Sea (hard edition)
    • 题目大意
    • 题解
    • 代码实现
  • E:OpenStreetMap
    • 题目大意
    • 题解
    • 代码实现

二维单调队列模板

E题是一个二维单调队列的板题,这里就先把板子甩出来
二维板子就是先维护每行,每行都是一个单调队列,然后再用行去维护列
求n*m矩阵中,边长为k的每个矩阵的最大值:
维护的行的最大值模板:

void solve_row () {for ( int i = 1;i <= n;i ++ ) {int head = 1, tail = 0;for ( int j = 1;j <= m + 1;j ++ ) {if ( j >= k + 1 ) {while ( head <= tail && deq[head] < j - k )head ++;rowmax[i][j - k] = h[i][deq[head]];}while ( head <= tail && h[i][deq[tail]] <= h[i][j] )tail --;deq[++ tail] = j;}}
}

维护列的最大值的模板

void solve_col () {for ( int j = 1;j <= m;j ++ ) {int head = 1, tail = 0;for ( int i = 1;i <= n + 1;i ++ ) {if ( i >= k + 1 ) {while ( head <= tail && deq[head] < i - k )head ++;colmax[i][j] = rowmax[deq[head]][j];}while ( head <= tail && rowmax[deq[tail]][j] <= rowmax[i][j] )tail --;deq[++ tail] = i;}}
}

输出模板:

for ( int i = 1;i <= n - k + 1;i ++ ) {for ( int j = 1;j <= m - k + 1;j ++ )printf ( "%d ", colmax[i][j] );printf ( "\n" );
}

维护行的最小值的模板

void solve_row () {for ( int i = 1;i <= n;i ++ ) {int head = 1, tail = 0;for ( int j = 1;j <= m + 1;j ++ ) {if ( j >= k + 1 ) {while ( head <= tail && deq[head] < j - k )head ++;rowmin[i][j - k] = h[i][deq[head]];}while ( head <= tail && h[i][deq[tail]] >= h[i][j] )tail --;deq[++ tail] = j;}}
}

维护列的最小值的模板

void solve_col () {for ( int j = 1;j <= m;j ++ ) {int head = 1, tail = 0;for ( int i = 1;i <= n + 1;i ++ ) {if ( i >= k + 1 ) {while ( head <= tail && deq[head] < i - k )head ++;colmin[i][j] = rowmin[deq[head]][j];}while ( head <= tail && rowmin[deq[tail]][j] >= rowmin[i][j] )tail --;deq[++ tail] = i;}}
}

输出模板

for ( int i = 1;i <= n - k + 1;i ++ ) {for ( int j = 1;j <= m - k + 1;j ++ )printf ( "%d ", colmin[i][j] );printf ( "\n" );
}

六神装已经出完,开始我们的三杀之旅吧!我要carry全场!

C:Basketball Exercise

题目大意

输入n接下来输入两个长度为n的h1,h2序列
然后开始从1~n进行选取,当在i位置的时候
1)不选,跳过
2)如果上一次的选择是h1数组,这一次就只能选h2[i]
3)如果上一次选的是h2序列,这一次就只能选h1[i]
求最后选取的数的和的最大值
n (1≤n≤10^5)
(1≤h2i,h1i≤10^9)

【输入输出样例】
Input
5
9 3 5 7 3
5 8 1 4 5
Output
29
Input
3
1 2 9
10 1 1
Output
19
Input
1
7
4
Output
7
【样例解释】
灰色是选的点
样例1:
在这里插入图片描述
样例2:
在这里插入图片描述

题解

i点有三种情况,不选,或根据前一个操作决定是选h1还是h2
那么i与前面挂钩,肯定可以搜索,数据范围又大,搜索会炸
坑定就是dp啦,况且本仙女最差的就是dp这玩意,我都能一眼看出这是dp
你说这道题板不版!
dp式也很简单我们定义一个二维就行,第一维表示模拟序列中i的位置,第二维三种状态
0表示不选i,1表示上一次选的h2,2表示上一次选的h1

好了,上马

代码实现

#include <cstdio>
#include <iostream>
using namespace std;
#define MAXN 100005
#define LL long long
int n;
int a[MAXN], b[MAXN];
LL dp[MAXN][3];
LL result;
int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ )scanf ( "%d", &a[i] );for ( int i = 1;i <= n;i ++ )scanf ( "%d", &b[i] );for ( int i = 1;i <= n;i ++ ) {dp[i][0] = max ( dp[i - 1][1], dp[i - 1][2] );dp[i][1] = max ( dp[i - 1][0], dp[i - 1][2] ) + a[i];dp[i][2] = max ( dp[i - 1][0], dp[i - 1][1] ) + b[i];}printf ( "%lld", max ( dp[n][1], dp[n][2] ) );return 0;
}

D2:Submarine in the Rybinsk Sea (hard edition)

ex至极,这tmd的mod就这么喜欢我吗,我这几天已经被它搞了3次了
你成全我吧!我们之间是没有结果的,你是单箭头,我已经把心交给了学习!
在这里插入图片描述

题目大意

输入n然后n个数,每两个数进行组合成一个新的数
如果第一个数位数大于第二个数的位数,第一个位数的前面不动,然后第一个数选一个,第二个数选一个。eg:91234,567,那么它们进行匹配的结果就是91253647
如果第二个数位大于第一个的数位,第二个位数的前面不动,还是第一个数选一个,第二个数选一个。eg:7658,123490,那么它们进行组合的结果就是1273645980

而且每两个数能组合成两个新数,因为这两个数都可以分别成为第一个数
eg:1234,5678组合的新数分别是15263748和51627384

他也可以和自己组合,eg:23它与自己组合就是2233,不过这个数只统计一次
而如果是不同的i,j但是他们都是23,2233就要算两次

求最后组合的所有新数的和取模998244353

n (1≤n≤100000)(1≤ai≤10^9)

题解

首先要知道两个ai如果都是1e9就必须要开longlong

接着我们来思考如果i的位数小于等于j的位数
那么i对i,j进行组合后的新数的贡献是一定的
eg:23,156组合后:12536,15263
23的个位对这些新数的贡献和为3在十位和个位的和,即33
23的十位对这些新数的贡献和为2在百位和千位的和,即2200
总贡献就是2233

如果i的位数大于j的位数
就用上面的例子来说明
156的个位和十位算法与上面一致
而从它多的位数开始的时候,它在新数的位置是固定的
不过有两个新数,那么156的百位的贡献就是两个10000,即20000

接下来用这种公式,就算位数为j的数字个数>2,直接乘以tot个数就行了
一定要注意mod,多mod又不会出事反正没有除法是吧!模模益善!

终于可以上车了!把车门给我焊死
在这里插入图片描述

代码实现

我写得有点多,mod模的很多,主要是害怕炸longlong,结果后面还是炸到了cs
如果是位数大于等于a[i]
cs就是模拟的a[i]的第j位会对答案做出哪两位的贡献,比如模拟的是个位那么我就用cs算出他在十位和个位的总贡献
如果是位数小于a[i]
cs还可以模拟固定的j位,比如23和145,cs就能模拟出1的贡献是200

#include <cstdio>
#define LL long long
#define mod 998244353
#define MAXN 100005
LL n;
LL a[MAXN];
LL tot[MAXN];
LL wei[MAXN];
LL result;
int main() {scanf ( "%lld", &n );for ( int i = 1;i <= n;i ++ ) {scanf ( "%lld", &a[i] );LL tmp = a[i];int cnt = 0;while ( tmp ) {cnt ++;tmp /= 10;}wei[i] = cnt;tot[cnt] ++;}for ( int i = 1;i <= n;i ++ ) {for ( int j = 1;j < wei[i];j ++ ) {if ( tot[j] == 0 ) continue;LL x = a[i], cs = 1, many = 1, t;while ( x ) {cs %= mod;t = x % 10;if ( many <= j ) result = ( result + ( t * cs % mod + cs * 10 % mod * t % mod ) % mod * tot[j] % mod ) % mod;elseresult = ( result + tot[j] * 2 % mod * t % mod * cs % mod ) % mod;x /= 10;if ( many <= j ) cs *= 100;else cs *= 10; many ++;}}for ( int j = wei[i];j <= 10;j ++ ) {if ( tot[j] == 0 ) continue;LL x = a[i], cs = 1, t;while ( x ) {cs %= mod;t = x % 10;result = ( result + ( t * cs % mod + cs * 10 % mod * t % mod ) % mod * tot[j] % mod ) % mod;x /= 10;cs *= 100;}}}printf ( "%lld", result % mod );return 0;
}

E:OpenStreetMap

题目大意

输入n,m,a,b
再输入g0,x,y,z
g[i]=(g[i−1] ⋅ x + y) mod z
hi,j=g[(i−1)⋅m+j−1]
求在行n列m的h矩阵中,所有a*b矩阵中最小值的和
(1≤n,m≤3000, 1≤a≤n, 1≤b≤m)(0≤g0,x,y<z≤10^9)

题解

所有a*b矩阵就很像一个滑动窗口再加上是求最值,那坑定就是用单调队列来维护
不过是个二维的滑动窗口罢了。。。我没有想说的了

在代码中我没有用c数组来记录维护的列的最小值,因为就多这一个二维数组,我就MLE
所以我在维护列的时候就顺便吧答案也给求了!
在这里插入图片描述
话不多说,屁不多放,上马

代码实现

#include <cstdio>
#include <iostream>
using namespace std;
#define LL long long
#define MAXN 3005
LL n, m, a, b, ii, x, y, z;
LL sum;
LL g[MAXN * MAXN], h[MAXN][MAXN];
LL row[MAXN][MAXN];
LL deq[MAXN];void init () {g[0] = ii;for ( int i = 1;i <= ( n - 1 ) * m + m - 1;i ++ )g[i] = ( g[i - 1] * x + y ) % z;for ( int i = 1;i <= n;i ++ )for ( int j = 1;j <= m;j ++ )h[i][j] = g[( i - 1 ) * m + j - 1];
}void solve_row () {for ( int i = 1;i <= n;i ++ ) {int head = 1, tail = 0;for ( int j = 1;j <= m + 1;j ++ ) {if ( j >= b + 1 ) {while ( head <= tail && deq[head] < j - b )head ++;row[i][j - b] = h[i][deq[head]];}while ( head <= tail && h[i][deq[tail]] >= h[i][j] )tail --;deq[++ tail] = j;}}
}
void solve_col () {for ( int j = 1;j <= m;j ++ ) {int head = 1, tail = 0;for ( int i = 1;i <= n + 1;i ++ ) {if ( i >= a + 1 ) {while ( head <= tail && deq[head] < i - a )head ++;sum += row[deq[head]][j];}while ( head <= tail && row[deq[tail]][j] >= row[i][j] )tail --;deq[++ tail] = i;}}
}int main() {scanf ( "%lld %lld %lld %lld", &n, &m, &a, &b );scanf ( "%lld %lld %lld %lld", &ii, &x, &y, &z );init ();solve_row ();solve_col ();printf ( "%lld", sum );return 0;
}

又到了说再见的时候,有任何问题的都可以留言,朕微服私巡的时候会回复的,不要太想大大哦~~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xor Transformation

题目&#xff1a; 给定一个X和Y&#xff0c;对于X每次可以选择一个A&#xff08;0<A<X&#xff09;&#xff0c;使得X X xor A&#xff0c;现在要求在5步内将X变为Y&#xff0c;请输出操作数目&#xff0c;以及每步的A 题解&#xff1a; 我一开始被题目给的样例个迷惑…

【做题记录】DP 杂题

P2577 [ZJOI2004]午餐 $\texttt{solution}$ 想到贪心&#xff1a; 吃饭慢的先打饭节约时间&#xff0c; 所以先将人按吃饭时间从大到小排序。 状态&#xff1a; \(f[i][j]\) 表示前 \(i\) 个人&#xff0c;在 \(1号\) 窗口打饭总时间 \(j\) &#xff0c;最早吃完饭的时间。 我们…

YBTOJ:方程的解(组合数学)(插板法)

文章目录题目描述解析代码题目描述 解析 第一感觉&#xff1a;啥都没感觉出来。。。 直接拿动态规划高精做的 但是只能拿40 重新分析一下这道题&#xff1a; g&#xff08;x&#xff09;首先可以拿快速幂很容易的求出来 问题就转化为了**把g(x)个东西分成k份的方案数 其实答案…

CF39C-Moon Craters【dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF39C 题目大意 坐标轴上有nnn个圆&#xff0c;给出每个圆的位置cic_ici​和半径rir_iri​。 要求选出最多的圆使得他们不相交&#xff0c;求方案。 1≤n≤20001\leq n\leq 20001≤n≤2000 解题思路 转换为选出最多的不交区…

开源库Magicodes.Storage正式发布

说明Magicodes.Storage&#xff0c;是心莱科技团队提供的统一存储库&#xff0c;相关库均使用.NET标准库&#xff08;netstandard2.0&#xff09;编写&#xff0c;支持.NET Framework以及.NET Core。我们希望&#xff0c;使用了Magicodes.Storage之后&#xff0c;开发者可以很快…

P3389 【模板】高斯消元法

P3389 【模板】高斯消元法 题目&#xff1a; 给定一个线性方程组&#xff0c;对其求解 题解&#xff1a; 还没接触高斯消元时以为是什么神仙算法&#xff0c;接触后发现。。。就是把我们手算线性方程组的方法&#xff0c;写成了代码emm。。。 比如&#xff1a; x-2y3z6 4x…

【CF 1188 A1,B,C】Add on a Tree // Count Pairs // Array Beauty

传送门 这些天风也温柔&#xff0c;题也温柔 开车啦&#xff01; 文章目录A1&#xff1a;Add on a Tree题意翻译题解证明代码实现B&#xff1a;Count Pairs题意翻译题解代码实现C&#xff1a;Array Beauty题目描述题解代码实现A1&#xff1a;Add on a Tree 题意翻译 给定一棵…

eShopOnContainers 知多少[5]:EventBus With RabbitMQ

1. 引言事件总线这个概念对你来说可能很陌生&#xff0c;但提到观察者&#xff08;发布-订阅&#xff09;模式&#xff0c;你也许就很熟悉。事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制&#xff0c;允许不同的组件之间进行彼此通信而又不需要相互依赖&am…

USACO Section 4

前言 好久没更新这个系列了&#xff0c;最近闲的无聊写一下。有两题搜索懒得写了。 P2737 [USACO4.1]麦香牛块Beef McNuggets https://www.luogu.com.cn/problem/P2737 解题思路 先只考虑a1a_1a1​&#xff0c;假设我们拼出了www&#xff0c;那么一定能拼出wka1wka_1wka1​…

YBTOJ:数列方案(组合数学)

文章目录题目描述解析代码题目描述 解析 如果它不取等&#xff0c;那就和方程的解这道题一样了&#xff0c;但有了等号就很头疼 如何把等号去掉呢&#xff1f; 定义BiAiiB~i~A~i~iB i A i i那么我们就可以得到&#xff1a;0<B1<B2<...<Bm<mn0<B~1~<B~2~&…

【COCI 2018/2019 Round #2】Kocka

这道题也是一个ex的模拟题 不过他比Zamjena可爱 作为一个帅气的小哥哥&#xff0c;让我们一起&#xff0c; 开启你的模拟ex大门&#xff0c;C从入门到放弃&#xff01; 题目 题目描述 我又来了&#xff01;我又来了&#xff01; 在清晨来到儿童游乐园的时候&#xff0c;出题…

Matrix Equation

题意&#xff1a; 题目给出两个矩阵X,Y,现在有两种操作 Z X Y D X⊙Y 问是否存在一个矩阵C&#xff0c;使得ACB⊙C式子成立&#xff0c;问矩阵C能有多少个 题解&#xff1a; 这个式子在模2意义下的加法就等于异或 也就相当于 那现在有 将BC移到左边 然后将Ci,j的系数进…

eShopOnContainers 知多少[6]:持久化事件日志

1. 引言事件总线解决了微服务间如何基于集成事件进行异步通信的问题。然而只有事件总线正常运行&#xff0c;微服务之间基于事件的通信才得以运转。 而现实情况是&#xff0c;总有这样或那样的问题&#xff0c;导致事件总线不稳定或不可用&#xff0c;比如&#xff1a;网络中断…

单调队列优化DP

全局最优解必然包含局部最优解&#xff0c;因此每次转移只需考虑局部最优解&#xff01;&#xff01;&#xff01; 主要内容 形如这样 的 \(\operatorname{DP}\) 转移方程&#xff1a; \[dp[i]\max_{L_i\le j\le R_i}{\{dp[i]val(i,j)\}} \]满足&#xff1a; \(\{L_i\}\) , \(\…

CF1322B-Present【双指针】

正题 题目链接:https://www.luogu.com.cn/problem/CF1322B 题目大意 给出nnn个数字aia_iai​求 ⨁i1n⨁ji1n(aiaj)\bigoplus _{i1}^n\bigoplus _{ji1}^n(a_ia_j)i1⨁n​ji1⨁n​(ai​aj​) 1≤n≤4105,1≤ai≤1071\leq n\leq 4\times 10^5,1\leq a_i\leq 10^71≤n≤4105,1≤a…

多体问题

代码&#xff1a; function SunEarthMoon % M函数文件load planets; % 将planets.mat中的变量mass、position、velocity加载过来[sun, earth, moon] deal(18, 3, 25); % sun、earth、moon分别是18、3、25行 list [sun, earth, moon]; % 1行3列矩阵 G 6.67e-11; % gr…

【CF1179 A,B,C】Valeriy and Deque / Tolik and His Uncle / Serge and Dining Room

还好题很温柔&#xff0c;温柔得我差点没做完 文章目录A&#xff1a;Valeriy and Deque题意题解代码实现B&#xff1a;Tolik and His Uncle题目题解代码实现C&#xff1a;Serge and Dining Room题目题解代码实现A&#xff1a;Valeriy and Deque 题意 给定一个双端队列&#…

YBTOJ:比赛得分(期望)

文章目录题目描述解析代码题目描述 解析 不太难的题 显然本题在AB队员大小关系相反时其对答案的贡献互为相反数。 所以想到把B队队员sort一下后就可以二分找到大小关系相反的分界点 然后维护和与平方和两个前缀数组搞一搞即可O1求出贡献 总复杂度&#xff1a;nlognnlognnlogn …

Matlab与高等数学

曲线与曲面画图 平面 对于不同曲线的表达式&#xff0c;Matlab中有不同的绘图命令&#xff0c;主要有 plot, fplot, ezplot&#xff0c;plot3&#xff0c;polar&#xff0c; 曲面 1.2 曲面画图 曲面的一般方程是F(x,y,z)0&#xff0c;一般需要将曲面的点坐标先表示出来&…

[USACO19JAN,Platinum] Redistricting

[USACO19JAN,Platinum] Redistricting 这道题A了才知道。。并不难a&#xff01; orz 题目 内存限制&#xff1a;128 MiB 时间限制&#xff1a;1000 ms 题目描述 奶牛们的最大城市Bovinopolis正在重新划分势力范围—生活在那里的主要是两个品种的奶牛&#xff08;Holsteins和…