Loading

10.2 模拟赛题解报告

T1 gcdlcm

题目描述

\(n\) 个数,找出所有 \(gcd\) 最大的数对中 \(lcm\) 最大的一个,输出这个 \(lcm\)

\(n , a_i \leq 10^6\)

solution

\(50pts\)

\(n ^ 2\) 直接枚举 \(i,j\) 就好了。

\(80pts\)

\(O(n\sqrt{n})\)

枚举每个数的因子,并对所有因子开个 \(vector\),把每个数都放到它所有因子的 \(vector\) 中,找出最大的含有大于等于两个数的因子,其中最大的两个数就是答案。

100pts

\(O(nlogn)\)

枚举 \(gcd\)

初始化 \(ret_1 = ret_2 = 0\)

\(cnt[gcd], cnt[2*gcd] \dots cnt[(n/gcd)*gcd]\)

\(cnt[j * gcd] ≥ 2\), 则 \(ret_1\)\(ret_2\) 都更新为 \(j * gcd\)

\(cnt[j * gcd] = 1\), 则 \(ret_2 = ret_1\), \(ret_1\) 更新为 \(j * gcd\)

\(ret_1, ret_2 > 0\),则用 \(ret_1 * ret_2 / gcd\) 更新答案

复杂度是个调和级数

\(n / 1 + n / 2 + n / 3 + ... + n / n = O(n log n)\)

code

/*
work by:Ariel_
Sorce:
Knowledge:
Time:
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#define int long long
using namespace std;
const int MAXN = 1e6 + 5;
int read() {
  int x = 0, f = 1; char c = getchar();
  while(c < '0' || c > '9'){if (c == '-') f = -1;c = getchar();}
  while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}
  return x * f;
}
int n, cnt[MAXN], fag, Max;
signed main(){
   n = read();
   for (int i = 1, x;  i <= n; i++) {
     x = read();
     cnt[x]++;
     Max = max(Max, x);
   }
   for (int i = Max; i >= 1; i--) {
     int ret_1 = 0, ret_2 = 0, js = 0;
     for (int j = i; j <= Max; j += i) {
        js += cnt[j];
        if(cnt[j] == 1) ret_2 = ret_1, ret_1 = j;
        else if(cnt[j] > 1) ret_1 = ret_2 = j; 
     }
     if(js >= 2) {
       cout<<ret_1 * ret_2 / i;
       break;
     }
   }
   system("pause");
   return 0;
}

T2 项链染色

题目描述

奶牛 Bessie 收到了 Farmer John 送的 \(k\) 条项链,每条项链由 \(n\) 个珠子组成,由于珠子是首尾相连的,所以第 1 个珠子和第 \(n\) 个珠子是相邻的。Bessie 有 \(m\) 种颜料可以给珠子染色,
这些颜料不一定需要全都用上。她希望染色后的项链满足下列两个条件:

任意连续的三个珠子的颜色互不相同。

\(n\) 个珠子和第 \(1\) 个珠子是相邻的,所以连续的三个珠子可能会同时包含第 \(1\) 个珠子和第 \(n\) 个珠子。举个例子,对于一条长度为 \(5\) 的项链,“红紫蓝红绿”不是一种可行的染色方案,因为对于第 \(4\) 个、第 \(5\) 个和第 \(1\) 个珠子,它们是连续的,但是出现了两个红色的珠子。

同一种颜色的珠子不会出现在不同项链上。

如果 \(k = 1\),那么这个条件一定是满足的;

如果 \(k = 2\),那么就要注意如果在一条项链上染了某种颜色的珠子,这种颜色就不能在另一条项链上染任何一颗珠子了。

请你帮她算算有多少种不同的染色方案。

注意: \(k = 2\) 时,两条项链不是等价的,即交换两条项链的染色方案和原方案视为两种不同的方案,可结合样例 2 理解。
由于答案可能很大,请输出答案对 \(p\) 取模的结果。

\(3 \leq n, m \leq 3000,1 < p \leq 10^9 + 7,1 \leq k \leq 2\)

solution

首先这不是正解,这应该能过80~90 分

先考虑一条项链的情况

\(f_{i, j, k}\) 表示当前染到第 \(i\) 个位置,上一个位置颜色为 \(j\),当前位置颜色为 \(k\) 的方案数。

现在强制规定第一个染成 \(1\), 第二个染成 \(m\), 那么初始值就为 \(f_{2, 1, m} = 1\)

转移很显然

\[f_{i, j, k} = \sum{f_{i - 1, u, j}} (u \neq j\&\&u\neq i) \]

状态是 \(O(nm^2)\), 转移是 \(O(m)\), 总复杂度位 \(O(nm^3)\)

\(g_{i, k} = \sum f_{i, j, k}\)

\(f_{i, j, k} = g_{i - 1, j} - f_{i - 1, k, j}\)

这样就优化到了 \(O(nm^2)\)

到了 \(f_{n - 2, j, k}\) 之后,枚举最后两位的颜色 \(u,v\)

\[ans = \sum_{1\leq j \leq m, 1 \leq k \leq m, j\neq k, u\notin\{j, k, v, 1\}, v\notin\{k, u, 1, m\}} f_{n - 2, j, k} \]

开头两个位置染色方案数有 \(A(m, 2) = m(m - 1)\) 种,那么
\(m(m - 1)ans\) 就是答案。

直接枚举是 \(O(m^4)\) 复杂度。

可以考虑统计有多少对 \((u, v)\) 满足 \(u\notin \{j, k, v, 1\}, v\notin\{k, u, 1, m\}\) 这样复杂度就是 \(O(m^2)\)

\(k\) 表示横坐标,\(j\) 表示纵坐标,于是有了下面这张图

大分类讨论

蓝色

\(1 < j, k < m, u \notin\{1, j, k, v\}, v \notin\{1,k, m, u\}\)

\(v\)\((m-3)\) 种取法,若 \(v=j\)\(u\)\((m-3)\) 种取法,否则有 \((m-4)\) 种取法

总共有 \((m-4)^2+(m-3)\) 种取法

上紫

\(j = 1, 1 < k < m,u ∉{1, k, v}, v∉\{1,k,m,u\}\)

\(v\)\((m - 3)\) 种取法,每种取法对应的 \(u\)\((m - 3)\) 种取法。

总共有 \((m - 3)^2\) 种取法

下紫

\(1 < j < m, k = m, u \notin \{1, j, m, v\}, v \notin \{1, m, u\}\)

\(u\)\((m - 3)\) 种取法,每种取法对应的 \(v\)\((m - 3)\) 种取法。

总共有 \((m - 3)^2\) 种取法。

绿色

\(1 < j < m, k = 1, u \notin{1, j, v}, v \notin{1, m, u}\)

\(u = m\), \(v\)\((m - 2)\) 种取法。

\(u < m\) ,此时 \(u\)\((m - 3)\) 种取法,每种取法对应的 \(v\)\((m - 3)\) 种取法。

总共有 \((m - 3)^2 + (m - 2)\) 种取法

红色

\(j = m, 1 < k < m, u \notin \{1, k, m, v\}, v \notin\{1, k, m, u\}\)

除了 1, k, m, 在剩下的 \((m - 3)\) 个数中选两个作为 \(u, v\)

总共有 \((m - 4)(m - 3)\) 种取法

黄色

\(j = 1, k = m, u \notin \{1, m, v\},v \notin\{1, m, u\}\)

总共有 \((m - 2)(m - 3)\)

黑色

\(j = m, k = 1, u \notin \{1, m, v\}, v \notin{1, m, u}\)

除了\(1, m\) 在剩下的 \((m - 2)\) 个数中选两个作为 \(u, v\)

总共有 \((m - 2)(m - 3)\) 种取法。

最后在 \(f_{n - 2}\) 上的每个位置上的方案数乘上每个位置对应的权重相加就是 \(ans\)

时间复杂度 \(O(n^2)\)

正解递推得到 \(f_{n - 2}\) 可以优化到 \(O(n)\) 统计答案可以优化到 \(O(1)\) 然而我并不会。

多条项链

\(f_{i}\) 表示最多用 \(i\) 种颜色染一条长度为 \(n\) 的项链的方案数。

\(g_{i}\) 表示恰好用 \(i\) 种颜色染一条长度为 \(n\) 的方案数。

\[g_i = f_i - \sum_{j = 1}^{i -1} {{i}\choose{j}} g_j \]

对于 \(f\) 数组就是第一问求得的答案。

枚举第一条项链使用的颜色个数为\(i\), 第二条项链使用的颜色为 \(j\)
答案为

\[\sum_{i = 1}^{m} \sum_{j = 1}^{m - i} {m \choose i} {{m - i} \choose j} g_i g_j \]

复杂度为 \(O(m^2)\)

T3 信号覆盖

题目描述

奶牛王国里有 \(n\) 块农场,它们排列在一条直线上,从左到右依次是 \(1\) 号,\(2\) 号,\(\dots\) \(n\) 号农场。现在为了给农场通上网,Farmer John 请来了牛国移动公司设计建造信号塔的方案。

移动公司的技术人员初步打算建立 \(m\) 座信号塔,其中第 \(i\) 座信号塔发射的信号强度为 \(p_i\),建在 \(q_i\) 号农场。已知信号强度衰减的程度和信号传播的距离成正比。为了简化问题,我们认为 \(x\) 号农场能够接收到的第 \(i\) 座信号塔传播过来的信号强度为

\[\max(p_i - |q_i - x|, 0) \]

又已知信号的强度可以叠加,即 \(x\) 号农场接收到的信号强度为:

\[\sum_{i = 1}^{m} \max(p_i - |q_i - x|, 0) \]

进一步地,奶牛王国的信号强度就是所有农场接收到的信号强度的最小值。Farmer John 希望奶牛王国的信号强度尽可能大。即,我们需要最大化

\[\min_{1\leq x \leq n} \sum_{i = 1} ^ {m} \max(p_i - |q_i - x|, 0) \]

作为高端技术人才的你,也被邀请参与方案的设计,但是眼看所有信号塔都定好了选址,Farmer John 想让你在目前的方案上做一些修改。他想知道,如果由你来决定第 \(i(1 ≤ i ≤ m)\)座信号塔的修建地址 \(q_i\),而其它 \((m − 1)\) 座信号塔的修建地址不变,那么奶牛王国的信号强度最大是多少。

\(n, m \leq 10^5, 1 \leq p_i \leq 10^5, 1 \leq q_i \leq n\)

solution

大雾 = =

首先对于每个信号塔 \((p, q)\),相当于在一个区间 \([L, q]\) 里加一个公差为 \(1\) 的等差数列,在区间 \([q, R]\) 里加一个公差为 \(-1\) 的等差数列。

其中 \(L = max(1, q - p + 1), R = min(n, q + p - 1)\)

每一次都暴力修改,时间复杂度 \(O(nm)\).

维护差分序列,时间复杂度 \(O(n + m)\).

区间 \([L, R]\) 加一个首项为 \(x\),公差为 \(d\),末项为 \(y\) 的等差数列

\(A’’[L] += x\)
\(A’’[L + 1] += d - x\)
\(A’’[R + 1] += - y - d\)
\(A’’[R + 2] += y\)

对于之后的每个询问,如果暴力枚举每个 qi 计算最小信号强度,那么单个询问的时间复杂度为 \(O(n^2)\).
时间复杂度 \(O(n^2m)\)
期望得分:\(30\)

对于之后的每个询问,首先把 \((p, q)\) 对每个位置上的影响消除。
设当前第 \(i\) 个位置上的信号强度为 \(a[i]\),二分答案 \(mid\)
\(a[i] < mid\),那么 \(i\)\(q\) 的距离不能超过 \(l = p - (mid - a[i])\)

\(𝑞∈[1,𝑛] ∩ ⋂_{𝑎_𝑖<𝑚𝑖𝑑}[𝑖−𝑙, i+𝑙]\)
如果 \(𝑞∈∅\),那么答案比 \(mid\) 小,否则比 \(mid\) 大。
时间复杂度 \(O(nm log V)\)\(V\) 是答案的范围。
期望得分:\(50\) 分。

对于 \((p, q) L = \max(1, q - p + 1), R = \min(n, q + p - 1)\) 分成三类:

  • \([1, L - 1]∪[R + 1, n]\): 没有被这个信号塔影响
  • \([L, q]\): 被信号塔影响,增加了 \(p-(q-x)\) 的信号
  • \([q + 1, R]\): 被信号塔影响,增加了 \(p-(x-q)\) 的信号

仍然是二分答案 \(mid\)
\([1, L - 1]∪[R + 1, n]\): 没有被这个信号塔影响
\(a[i] < mid\),那么 \(i\)\(q\) 的距离不能超过 \(l = p - (mid - a[i])\)
\(𝑞∈[1,𝑛]∩⋂_(𝑎_𝑖<𝑚𝑖𝑑)[𝑖−𝑙, 𝑖+𝑙]\)
即求 \(\max\{i - l | ai < mid\}\)\(\min\{i + l | ai < mid\}\)

\(\max\{i - p + mid - a[i] | ai < mid\} = \max\{i - a[i] | ai < mid\} - p + mid\)

\(\min\{i + p - mid + a[i] | ai < mid\} = min\{i + a[i] | ai < mid\} + p - mid\)

\([L, q]\): 被信号塔影响,增加了 \(p-(q-x)\) 的信号
实际上的 \(a[i]’ = a[i] - [p-(q-i)] = a[i] - p + q - i\)
\(a[i] < mid\),那么 \(i\)\(q\) 的距离不能超过 \(l = p - (mid - a[i]’) = -mid + a[i] + q - i 𝑞∈[1,𝑛]∩⋂_{𝑎_𝑖<𝑚𝑖𝑑}[𝑖−𝑙, 𝑖+𝑙]\)

即求 \(\max\{i - l | ai - p + q - i < mid\} 和 \min\{i + l | ai - p + q - i < mid\}\)

\(\max\{2i + mid - a[i] - q | ai - i < mid + p - q\} = \max\{2i - a[i] | ai - i < mid + p - q\} - q + mid\)
\(\min\{-mid + a[i] + q | ai - i < mid + p - q\} = \min\{a[i] | ai - i < mid + p - q\} + q - mid\)

\([q + 1, R]\): 被信号塔影响,增加了 \(p-(x-q)\) 的信号
实际上的 \(a[i]’ = a[i] - [p-(i-q)] = a[i] - p - q + i\)

\(a[i] < mid\),那么 \(i\)\(q\) 的距离不能超过 \(l = p - (mid - a[i]’) = -mid + a[i] - q + i 𝑞∈[1,𝑛]∩⋂_{𝑎_𝑖<𝑚𝑖𝑑}[𝑖−𝑙, 𝑖+𝑙]\)

即求 \(\max\{i - l | ai - p - q + i < mid\} 和 \min\{i + l | ai - p - q + i < mid\}\)

\(\max\{mid - a[i] + q | ai + i < mid + p + q\} = \max\{-a[i] | ai + i < mid + p + q\} + q + mid\)

\(\min\{2i - mid + a[i] - q | ai + i < mid + p + q \} = \min\{2i + a[i] | ai + i < mid + p + q\} - q - mid\)

求解:
$\max{i-a[i] | ai < mid} $

\(\min\{i+a[i] | ai < mid\}\)

\(\max\{2i-a[i] | ai - i < mid + p - q\}\)

\(\min\{a[i] | ai - i < mid + p - q\}\)

\(\max\{-a[i] | ai + i < mid + p + q\}\)

\(\min\{2i+a[i] | ai + i < mid + p + q\}\)

举例:\(max\{2i-a[i] | ai - i < mid + p - q\}\)

\(ai - i\) 全部离散化,映射到 [1, n] 中。
使用可持久化线段树

树 Ti 中所有 \(aj - j\) 离散化后小于等于 i 的位置上都填上 \(2j - a[j]\) 的值

先通过二分找到 \(ai - i < mid + p - q\) 的最后一颗树 Tk 在 Tk 上查询 \(i\) 所在的区间最大值即可。

对于每一个询问,二分时间复杂度 \(O(log V)\),可持久化线段树上查询 \(O(log n)\)
总的时间复杂度为 \(O(m log V log n)\)
期望得分:\(100\)

posted @ 2021-10-04 17:44  Dita  阅读(47)  评论(4编辑  收藏  举报