A. Least Product

  • 存在 \(a[i] = 0\),\(min = 0\),不需要任何操作。
  • 负数个数为偶数(包括0),\(min = 0\),把任意一个改为 \(0\)。
  • 负数个数为奇数,\(min = \prod a[i]\),不需要任何操作。
void solve() {
int n;
cin >> n;
vector<int> b, c, d;
for(int i = 0; i < n; ++ i) {
int x;
cin >> x;
if(x > 0) b.push_back(x);
else if(x == 0) c.push_back(x);
else d.push_back(x);
}
if(c.size()) puts("0");
else if(d.size() % 2 == 0) puts("1\n1 0");
else puts("0");
}

B. Erase First or Second Letter

枚举每个字符 \(s[i]\),统计以当前字符为第一个元素的方案数。

因为第一个元素已经确定,所以只能删 \([i + 1, j]\)的子串。

先前出现过的字符直接 \(continue\)。

void solve() {
int n;
string s;
cin >> n >> s;
ll ans = 0;
vector<bool> vis(26, 0);
for(int i = 0; i < n; ++ i) {
if(!vis[s[i] - 'a']) {
vis[s[i] - 'a'] = 1;
ans += (n - i);
}
}
cout << ans << '\n';
}

C. Watering an Array

考虑把数组清零后怎么贪。

在若干次操作后,整个数组一定是非增的,因此每一天最多有一个位置满足条件。

显然,每两天就进行一次 \(reset\) 操作为最优。


现在回过来处理原始数组。

枚举操作到第 \(i\) 天后再清零。

一次清零最多能得到 \(n\) 个贡献。

因此当 \(i > 2n\) 后,一定不如一开始就清零更优,\(i\) 枚举到 \(2n\) 就行。

注意 \(i\) 要严格小于 \(d\),否则没有多余天数给清零操作。

void solve() {
int n, k, d;
cin >> n >> k >> d;
vector<int> a(n + 1), v(k);
int ans = 0;
for(int i = 1; i <= n; ++ i) {
cin >> a[i];
if(a[i] == i) ++ ans;
}
for(int &x : v) cin >> x;
ans += (d - 1) >> 1;
for(int i = 0; i < 2 * n; ++ i) {
if(i == d - 1) break;
int res = 0;
for(int j = 1; j <= v[i % k]; ++ j) ++ a[j];
for(int j = 1; j <= n; ++ j) if(a[j] == j) ++ res;
res += (d - i - 2) >> 1;
ans = max(ans, res);
}
cout << ans << '\n';
}

D. Yet Another Inversions Problem

E. Construct Matrix

一个显然的性质:若得到一组关于 \(k\) 的解,则对答案整个取反后能得到 \(k = n^2 - k\) 的解。

首先考虑无解。

  • 若 \(k\) 为奇数,无解。
  • 若 \(n > 2\) 且 \(k = 2\) 或 \(k = n ^2 - 2\),无解。

我们不妨假设剩下的情况都是有解的。

情况一:\(n=k\),很好构造。

void case1() {	// k == n
for(int i = 1; i <= n; ++ i) a[i][i] = 1;
}

情况二:\(n\bmod 4 = 0\)

  • 在一行(列)里添加偶数个 \(1\) 不会对原异或值有任何改动。

根据这条性质,容易想到用 \(\dfrac{k}{4}\) 个 \(2\times 2\) 的单元去填整个网格。

\[\left[
\begin{matrix}
1 & 1\\
1 & 1
\end{matrix}
\right]
\]
void case2() {	// k % 4 == 0
for(int i = 1; i <= n; ++ i) {
for(int j = 1; j <= n; ++ j) {
if(!a[i][j] && k) {
a[i][j] = a[i + 1][j] = a[i][j + 1] = a[i + 1][j + 1] = 1;
k -= 4;
}
}
}
}

情况三:\(n\bmod 4 = 2\)

去思考如何把情况三转化到情况二。

我们可以在网格的左上角构造如下 \(4\times 4\) 的单元格。

\[\left[
\begin{matrix}
1 & 1 & 0 & 0\\
1 & 0 & 1 & 0\\
0 & 1 & 1 & 0\\
0 & 0 & 0 & 0
\end{matrix}
\right]
\]

把 \(k\) 整体减去 \(6\) 后成功转化为情况二。

按照上述构造方法需要考虑 \(k_{max} = n^2 - 9\)。

如果 \(k\) 大于其最大值,则令 \(k = n^2 - k\),最后翻转答案。

void Reverse (){
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= n; ++ j)
a[i][j] ^= 1;
}
void case3() { // k % 4 == 2 bool f = 0;
if(k > n * n - 9) f = 1, k = n * n - k; a[1][1] = a[1][2] = a[2][1] = a[2][3] = a[3][2] = a[3][3] = 1;
k -= 6; for(int i = 1; i <= n; ++ i) {
for(int j = 1; j <= n; ++ j) {
if(i <= 4 && j <= 4) continue;
if(!a[i][j] && k) {
a[i][j] = a[i + 1][j] = a[i][j + 1] = a[i + 1][j + 1] = 1;
k -= 4;
}
}
}
if(f) Reverse();
}

F. Construct Tree

先把 \(a\) 排序。

  • 性质一:对于任意两条边 \(e1,e2\),一定存在至少一条路径同时通过这两条边。

容易得到,若 \(a[n] + a[n - 1] > d\),则一定无解。

  • 性质二:若存在边集 \(E\)(不含 \(a[n]\))的子集 \(S\) 满足 \(\sum S = d - a[n]\),则一定有解。

把 \(S\) 中所有边构成一条链挂在根节点上

对于剩余的边则一个一个挂上去。

注意:此时已经将性质一中的无解情况去掉了,可以证明此时满足条件。。

  • 性质三:设 \(S_1, S_2\) 为边集 \(E\)(不含 \(a[n]\))的两个互不重合的子集。若 \(S_1\) 与 \(S_2\) 的和都大于 \(a[n]\),则一定有解。

把 \(S_1\) 中所有边构成一条链挂在根节点上,\(S_2\) 同样操作。

对于剩余的边则一个一个挂上去。

可以证明此时满足条件。

对于性质三,我们可以用 \(dp[i][j]\) 表示 \(S_1\) 总和为 \(i\),\(S_2\) 总和为 \(j\) 的方案是否存在。

对于性质二,可以用 \(dp[0][n - a[n]]\) 表示状态。

联想到 \(01\) 背包问题,复杂度 \(O(nd^2)\),会超时。

由于状态是 \(01\) 的,可以用 \(bitset\) 压下位,复杂度 \(O(\dfrac{nd^2}{\omega})\),可以通过。

int n, d, a[N];
bitset<N> dp[N]; void solve() {
cin >> n >> d;
for(int i = 1; i <= n; ++ i) cin >> a[i];
sort(a + 1, a + n + 1);
if(a[n] + a[n - 1] > d) {
puts("No");
return;
}
for(int i = 0; i <= d; ++ i) dp[i].reset();
dp[0][0] = 1;
for(int i = 1; i < n; ++ i) {
for(int j = d; j >= 0; -- j) {
if(j + a[i] <= d) dp[j + a[i]] |= dp[j];
dp[j] |= dp[j] << a[i];
}
}
bool ok = dp[0][d - a[n]];
for(int i = a[n]; i <= d - a[n]; ++ i) ok |= dp[i][d - i];
puts(ok ? "Yes" : "No");
}

Codeforces Round 917 (Div. 2)的更多相关文章

  1. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  2. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  3. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  6. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  7. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  8. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

  9. Codeforces Round #268 (Div. 2) ABCD

    CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

  10. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

随机推荐

  1. wire和reg型变量的组合使用

    模型功能 实现寄存器之间的连线 实现寄存器的声明 建构时钟的时序系统 模型框图 `timescale 1ns / 1ps /* */ // ****************************** ...

  2. linux关闭主板警告声,蜂鸣声,滴滴声,pc扬声器。

    启动时,BIOS 通常会在开机自检期间发出蜂鸣声.较新的主板型号省略了开机自检蜂鸣声,以便快速启动进入操作系统.BIOS 通常允许切换开机自检蜂鸣声,但无法将 PC 扬声器配置为完全关闭.一旦系统启动 ...

  3. Minlexes题解

    \(\texttt{Problem Link}\) 简要题意 在一个字符串 \(s\) 中,对于每个后缀,任意删掉一些相邻的相同的字符,使得字符串字典序最小. 注意:删掉之后拼起来再出现的相邻相同字符 ...

  4. OpenHarmony有氧拳击之应用端开发

    一.简介 继<OpenHarmony有氧拳击设备端的开发>后,本次为大家带来酷炫的应用端开发.如下,开发者伴随着音乐,律动出拳后,那开发板屡屡播放"挨打"效果,这究竟是 ...

  5. [一本通1677/JZOJ1217/CJOJ1101]软件开发 题解

    题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成\(m\)个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块的所用 ...

  6. C 语言:类型转换与常量的细致理解

    C 语言中的类型转换 有时,您必须将一种数据类型的值转换为另一种类型.这称为类型转换 隐式转换 当您将一种类型的值分配给另一种类型的变量时,编译器会自动进行隐式转换. 例如,如果您将一个 int 值分 ...

  7. mysql迁移sqlServer和mybatisPlus下查询语句转换为SqlServer2008

    mysql数据迁移sqlServer2008 mybatisPlus下查询语句转换 一.mysql数据迁移到sqlServer2008中(包括数据结构和数据) 最近公司项目需要使用sqlServer以 ...

  8. Python scipy.ndimage.find_objects用法及代码示例

    用法 scipy.ndimage.find_objects(input, max_label=0) 在标记数组中查找对象. 参数: input: 整数数组 包含由不同标签定义的对象的数组.值为 0 的 ...

  9. MMDeploy部署实战系列【第三章】:MMdeploy pytorch模型转换onnx,tensorrt

    MMDeploy部署实战系列[第三章]:MMdeploy pytorch模型转换onnx,tensorrt 这个系列是一个随笔,是我走过的一些路,有些地方可能不太完善.如果有那个地方没看懂,评论区问就 ...

  10. iOS自动化打包命令xcodebuild大全

    iOS实现自动化打包已经稳定运营几年了,不同的场景用到xcodebuild命令不一样,有的参数可能一直都用不到,列举一些常用的命令,比如编译命令: xcodebuild archive -worksp ...