|
可以用RMQ
#include<bits/stdc++.h> using namespace std; const int N = 1e6; int a[N]; int f[N][20]; int n,k; int main() { scanf("%d %d",&n,&k); for(int i = 1;i<=n;i++) { scanf("%d",&a[i]); f[i][0] = a[i]; } for(int i = 1;i<=log2(n);i++) { for(int j = 1;j<=n-(1<<i)+1;j++) { f[j][i] = min(f[j][i-1],f[j+(1<<(i-1))][i-1]); } } for(int i = 1;i+k-1<=n;i++) { int x = i,y = i+k-1; int k = log2(y-x+1); printf("%d ",min(f[x][k],f[y-(1<<k)+1][k])); } printf("\n"); for(int i = 1;i<=n;i++) { f[i][0] = a[i]; } for(int i = 1;i<=log2(n);i++) { for(int j = 1;j<=n-(1<<i)+1;j++) { f[j][i] = max(f[j][i-1],f[j+(1<<(i-1))][i-1]); } } for(int i = 1;i+k-1<=n;i++) { int x = i,y = i+k-1; int k = log2(y-x+1); printf("%d ",max(f[x][k],f[y-(1<<k)+1][k])); } return 0; }
题目495 [POJ 2823]滑动窗口
AAAAAAAAA
![]()
2024-01-06 18:47:43
|
|
×
提示!该题解未通过审核,建议分享者本着启发他人,照亮自己的初衷以图文并茂形式完善之,请勿粘贴代码。#include<bits/stdc++.h> using namespace std; int main() ........................................................................ 该题解等待再次审核........................................................................(剩余 490 个中英字符)
题目3049 [NOIP 2018PJ]标题统计
2024-01-04 20:08:13
|
|
“引爆逆天力量,追寻圆环之理的神藏奥秘”系列再现高手。 首先最终的树的点数可以达到 $10^{10}$ 级别,我们肯定不能真正把树建出来。 但是注意到我们可以只保留每个复制出的子树的根(记作关键点),那么这些根也构成一棵树,这样就好办了。 当询问 $dis(x,y)$ 时,我们先找到 $x$ 和 $y$ 分别从属于的关键点,并求出它们在关键点树上的距离,而这是容易预处理的。需要注意的是,在 lca 处涉及同一关键点范围内的距离,在原树上查其距离即可。 以及,在定位点时,涉及查询原树某棵子树内编号第 $k$ 大的点,把树拍成 dfn 序后主席树上二分即可。 时间复杂度 $O(n\log n)$,有点难写。
题目2052 [HNOI 2016] 树
![]()
2023-12-21 22:09:47
|
|
Pro368 水仙花数 题解这道题主要考验枚举与拆位,可以按题目要求直接将三位数拆位就三次幂和判断相等与否(真水) /除号 %取模号 百位: x/100 十位:
x/10%10 个位 x%10
题目368 水仙花数
AAAAA
![]()
2023-12-03 08:34:54
|
|
Pro2976 偷笔记 题解挺好的递推+恶心的矩阵快速幂题 题面:有一个n行m列的棋盘,在当前位置可以瞬移,每次可向右瞬移奇数列,且瞬移到本行或相邻行,并且不能瞬移出棋盘,问从$(1,1)至(n,m)$的总方案数 首先考虑递推,设$f(i,j)$为投当前在第i行第j列的方案数,因为每次可以向右瞬移,所以$f(i,j)$可以由上一列,上上上一列...推出来,且可以由上一行和下一行推出 则递推转移方程式为$f(i,j) = \sum_{k=j-w,w=1,w+=2}^j f(i,k)+f(i-1,k)+f(i+1,k)$ 这样直接枚举是$O(nm^2)$的复杂度,肯定是不行的,那我们继续考虑 我们设$g(i,j) = \sum_{k=j-w,w=1,w+=2}^j f(i,k) = g(i,j-2) + f(i,j-1)$ 则方程式转为$f(i,j) = g(i-1,j) + g(i,j) + g(i+1,j) = g(i-1,j-2) + f(i-1,j-1) + g(i,j-2) + f(i,j-1) + g(i+1,j-2) + f(i+1,j-1)$ 我们在维护$f$的同时维护$g$则时间复杂度会降到$O(nm)$ 一看数据$10^9$,再次拿出我们的dz,一眼鉴定为矩阵快速幂 然后就开始我们快(恶)乐(心)的推转移矩阵的时候: 根据转移方程我们可以分成两种情况,即上一列的方案和上上一列的方案,因为上上一列的方案数在推下一列的方案数时要用到,所以不能去掉,我们都需要记录,所以需要当推到$f(i,j)$时,我们需要$f(i,j-1), g(i,j-1), g(i,j-2)$把这三列归为一列,$1至n$为$f(i,j-1)$,$n+1至2n$为$g(i,j-1)$,$2n+1至3n$为$g(i,j-2)$最后该矩阵的长度为$3n$最大为150,则我们转移矩阵大小为$3n * 3n$ 先看应该怎样转移 $$\begin{bmatrix}f(1,j-1) & f(2,j-1) & ... & f(n,j-1) & g(1,j-1) & g(2,j-1) & ... & g(n,j-1) & g(1,j-2) & g(2,j-2) & ... & g(n,j-2) \\\end{bmatrix}$$ 应该转移为 $$\begin{bmatrix}f(1,j) & f(2,j) & ... & f(n,j) & g(1,j) & g(2,j) & ... & g(n,j) & g(1,j-1) & g(2,j-1) & ... & g(n,j-1) \\\end{bmatrix}$$ 所以根据递推转移方程考虑转移矩阵,则可推出矩阵为: 设转移矩阵为$c(i,j)$ 首先先看f的矩阵:根据递推方程 当$f(i,j)$时 只需将$c(i-1,i),c(i,i),c(i+1,i)$设为1,才加上$g$即将$c(2*n+i-1,i),c(2*n+i,i),c(2*n+i+1,i)$再设为1就可以了 再考虑$g(i,j)$ 由递推方程式得 应当将$c(i,i+n),c(i+2*n,i+n)$置为1即可 最后看$g(i,j-1)$ 在转移前已经出现,不需要推,所以只要将$c(i+n,i+2*n)$置为1即可 (因为矩阵实在太大画不下,只好描述一下) Oo最后开始愉悦的矩阵快速幂时刻oO 复杂度为$O(150^3*log(1e9))$,大约为$1e8$所以跑的飞慢qwq 二维递推实在痛苦┭┮﹏┭┮
题目2976 偷笔记
AAAAAAAAAA
![]()
2023-11-21 20:41:53
|
|
挺好的递推+矩阵快速幂题 题面:有一个m面的骰子,问投n次使投到第6面为偶数次的方案数 首先考虑递推,设f(i,j,k)为投i次的情况,j为0或1 (0为本次未投到第6面,1为投到了),k为0或1 (当前投到第6面次数的奇和偶,0为偶,1为奇) 转移方程为$f(n,1,0) = f(n-1,1,1) + f(n-1,0,1)$ $f(n,1,1) = f(n-1,1,0) + f(n-1,0,0)$ $f(n,0,0) = m-1 * f(n-1,1,0) + m-1 * f(n-1,0,0)$ $f(n,0,1) = m-1 * f(n-1,1,1) + m-1 * f(n-1,0,1)$ 看到n的范围$10^{18}$ wow,一眼dz,肯定要快速幂,根据递推可以想到矩阵快速幂,下面开始推转移矩阵 可以想到 $$\begin{bmatrix}f(n-1,1,0) & f(n-1,1,0) & f(n-1,0,0) & f(n-1,0,1) \\\end{bmatrix}$$ 应该转移为 $$\begin{bmatrix}f(n,1,0) & f(n,1,0) & f(n,0,0) & f(n,0,1)\end{bmatrix}$$ 所以根据递推转移方程考虑转移矩阵,则可建出矩阵为: $$\begin{bmatrix}0 & 1 & m-1 & 0\\1 & 0 & 0 & m-1\\0 & 1 & m-1 & 0\\1 & 0 & 0 & m-1\\\end{bmatrix}$$ 初始矩阵为$f(1)$ 即 $\begin{bmatrix}0 , 1 , m-1 , 0\end{bmatrix}$ OO最后直接跑矩阵快速幂就行了OO 复杂度为$O(4^3*log(n))$ 好像这道题还有数学方法,但不会
题目2420 五彩的色子
AAAAAAAAAA
![]()
2023-11-17 11:31:07
|