给定一个 \(n \times n\) 矩阵,先进行 \(m_1 \leq 5e4\) 次区间加,再进行 \(m_2 \leq 5e5\) 次询问,每次询问要求输出矩形区间内的最大数.\(n \leq 2000\) Solution 考虑到 \(n\) 比较小,可以直接二位差分前缀和搞出整个矩阵. 然后一本正经地扔进二维线段树 二维线段树怎么写来着? 卡常致死 返回值慢得让人恶心 #include <bits/stdc++.h> using namespace std; #define ll…
给定 \(m\) 个询问,每个询问是一个区间 \([l,r]\),你需要通过自由地设定每个节点的 \(mid\),设计一种"自适应线段树",使得在这个线段树上跑这 \(m\) 个区间询问时,需要访问节点的次数最少. Solution 对于询问 \([ql,qr]\) 和结点 \([l,r]\) 如果 \([ql,qr]\) 与 \([l,r]\) 相交但不包含,贡献为 \(1\) 如果 \([ql,qr]\) 包含 \([l,r]\) 如果 \(l=r\),则贡献 \(1\) 如果 \…
神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205]; signed main() { cin>>n>>mod; for(int i=0;i<=2*n;i++) { c[i][0]=1; for(int j=1;j<=i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; } int ans=…
于是去弄了个板子来 #include <bits/stdc++.h> using namespace std; #define int long long const int mod = 998244353; const int N = 505; int qpow(int p,int q) {return ((q&1)?p:1) * (q?qpow(p*p%mod,q>>1):1) % mod;} int n, Q; // Input: a[][],n // Method:…
给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值. Solution 对于一对 \((i,j), i<j, p[i]<p[j]\),其对 \(k \in (p[i],p[j])\) 有 \(2^{(i-1)+(n-j)}\) 的贡献 于是我们得到了 \(O(n^2 \log n)\) 暴力 考虑枚举左侧的 \(i\),它会与右侧 \(p[j]&g…
求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp,设 \(f[i]\) 表示 \(n=i\) 时的答案,则 \[ f[i]=\sum_{j=1}^n [j|K] \cdot C_{i-1}^{j-1} \cdot (j-1)!\cdot f[i-j] \] #include <bits/stdc++.h> using namespace std…
给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i \leq 20\),数据组数 \(\leq 100\) Solution 我们考虑将这些数分段,每段刷成区间内的最大值,那么很显然就可以 DP 了 \(f[i][j]\) 表示搞定了前 \(i\) 个数,操作了 \(j\) 次,则转移方程 \[ f[i][j]=\max_k (f[k][j-\fr…
给定一个长 \(n\) 的序列 \(a_1,\dots,a_n\),定义 \(f(x)\) 为有多少个 \(a_i \leq x\) 有 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\sum_{i=l}^r f(i \ xor\ x)^2\) Solution 定义 \(S*x={y \ xor \ x|y \in S}\),\((x)_i\) 表示 \(x\) 第 \(i\) 位的值,则所求为 \(\sum_{y\in[L,R]*x} f^2(y)\),差分一下,只需要求 \(\…
对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 Solution 显然 \(f[1]=1\),考虑所有满足 \(f[x]=1\) 的位置 \(b_1,\dots,b_k\),一定有 \(p_{b_1}>p_{b_2}>\dots >p_{b_k}\) 由于 \(b_1=1\),我们要最小化 \(p_1\),所以填入 \(p_{b_i}=…
给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和. Solution 先搞一波离散化,把 设 \(f[i][j]\) 表示处理完了 \(a[1\dots i]\),且 \(a[i]\) 在第 \(j\) 个区间内的总和, \(g[i][j]\) 为方案数 考虑运用分段的思想,枚举下一段的结束点 \(p\),以及下一段所在区间 \(k\),就可以暴力转移到 \(f[p][…