打这场的时候迷迷糊糊的,然后掉分了(

A Prison Break:

题面很复杂,但是题意很简单,仅需求出从这个点到四个角的最大的曼哈顿距离即可

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
int times;
int n,m,r,c;
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> times;
while(times--) {
cin >> n >> m >> r >> c;
cout << max(max(abs(1 - r) + abs(1 - c),abs(n - r) + abs(1 - c)),max(abs(1 - r) + abs(m - c),abs(n - r) + abs(m - c))) << '\n';
}
return 0;
}

B Repainting Street:

限制长度的区间覆盖,要求得到最后得到相同颜色的最少操作数

颜色确定之后便可以暴力覆盖

注意到颜色的值域很小,故枚举颜色即可

\(p.s.\)这道题 \(Wa\) 了两发,原因是区间长度是固定的,该染到的一定染到

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int times;
int n,m;
int a[N];
int b[N];
int vis[101];
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> times;
while(times--) {
memset(vis,0,sizeof vis);
cin >> n >> m;
for(int i = 1;i <= n;i++) {
cin >> a[i];
}
int ans = 2e9;
for(int C = 1;C <= 100;C++) {
int tot = 0,las,k;
for(int i = 1;i <= n;i++) b[i] = a[i];
for(int i = 1;i <= n;i++) {
las = k = i;
if(b[i] != C)
while(k - las + 1 <= m) {
b[k] = C;
k++;
}
else continue;
k--;
i = k;
tot++; }
ans = min(ans,tot);
}
cout << ans << '\n';
}
return 0;
}

C Bouncing Ball :

不难发现,删除前面一块等价于把所有的往前移动一块

并且最后的代价与删除操作和添加操作顺序无关

所以直接枚举删除操作数量即可,因为每次都跳固定的 \(k\)

所以跳到的块的下标满足 \(i\space \%\space k\space =\space p\space (i = t \times k + p)\)

从后往前开一个桶扫一遍即可

\(p.s.\) 因为 \(B\) 题卡了有点久,这题最后结束了才 \(AC\) (掉分的原因

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n,m;
char a[N];
int times,tong[N],x,y;
int p,k;
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> times;
while(times--) {
cin >> n >> p >> k;
cin >> (a + 1);
cin >> x >> y;
ll ans = 2e18;
for(int i = n;i >= 0;i--) tong[i] = 0;
for(int i = n;i >= p;i--) {
if(a[i] == '0') tong[i % k] += x;
ans = min(ans,1ll * (i - p) * y + tong[i % k]);
}
cout << ans << '\n';
}
return 0;
}

D XOR-gun :

\(Xor\) 的性质太多了

这里来做一个总结 :

\(x \otimes y \le x + y\) 适用于任何情况,作用于限制其余变量缩小问题状态

\(x \otimes y \le 2 ^ n\) 适用于 \(x \le 2 ^ n\) 并且 \(y \le 2 ^ n\)

所以做异或的题从两方面来考虑 :

1.二进制角度上

2.整数域计算上

这道题上,要求用 $\otimes $ 破坏非减单调序列,第一条性质做不了

当存在两个在二进制上最高位相同的数时,异或之后一定可以使得到的数减少一半

并且当此时再存在一个数在最高位上与前面两个数相同时,则一定可以一次操作完成

根据鸽子原理,那么 \(n \ge 2 \times log 10^9\) 时便直接输出 \(1\) 即可,否则直接枚举出当前想把序列破坏掉的两个数即可

复杂度 \(O(n^3)\)

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N],sum[N];
int ans = 2e5 + 10;
int n;
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i++) {
cin >> a[i];
sum[i] = sum[i - 1] ^ a[i];
}
if(n > 60) {
cout << "1" << '\n';
return 0;
}
for(int k = 1;k < n;k++) {
for(int i = 1;i <= k;i++) {
for(int j = k + 1;j <= n;j++) {
int s1 = sum[k] ^ sum[i - 1] ,s2 = sum[j] ^ sum[k];
if(s1 > s2) {
ans = min(ans,j - k - 1 + k - i);
}
}
}
}
if(ans == 2e5 + 10)
cout << "-1" << '\n';
else
cout << ans << '\n';
return 0;
}

E New Game Plus!:

如果这题的 \(k\) 很小,也许可以用 \(dp\) 解决

所以这里考虑其他算法,因为求得最值,所以考虑贪心

首先考虑 \(k = 0\) 的情况,容易发现,一个 \(boss\) 的贡献是他所处的位置离结尾还有多少个乘上 \(C_i\)

所以考虑使用经典贪心微调法来证明此时应满足 \(C_i >= C_{i + 1} (i < n),i \in Z\) 时结果最优

再考虑 \(k != 0\) 的情况,容易发现,一旦使用一次 \(reset\) 游戏将会被重置为新游戏,所以游戏分为了 \(k + 1\) 个游戏。

在每一个独立的游戏中,每打一个 \(boss\) 的贡献可以写作 \(p \times C_i\) ,也就是说,当我们发现如果存在 \(p_i > p_j\) 但 \(C_i < C_j\) 的时候,一定存在更优解

那么也就是说,为了让 \(C_i > 0\) 的 \(p\) 尽量大,我们考虑将第一个正数放进来的过程,这第一个正数必然会放在此时可以令它的 \(p\) 最大的一个游戏之中

那么接下来的正数依旧会放在这个正数的后面,所以我们可以把所有的正数放在一个游戏中

同样的,我们来考虑负数的 \(p\),我们想让 \(p\) 尽量小,所以一旦发现存在两个游戏中的第一个元素是负数,并且 \(p_1 - p_2 \ge 2\) 时,可以将 \(p_1\) 放在 \(p_2\) 的后面,以得到更优解

我们来考虑如何实现这个贪心的过程

(注:这里不证明为什么必须用完 \(k\) 次 \(reset\))

首先,对于第一条,正数都将在一个游戏之中,那么,我么考虑维护一个大根堆,这样可以满足。

考虑处理负数,那么一次 \(reset\) 相当于在单调队列中插入 \(k + 1\) 个 \(0\) ,如果此时正数的游戏中 \(sum > 0\) 则此时放在 \(sum > 0\) 依然是最优的

当正数游戏中 \(sum < 0\) 时,此时再插入会得到更差解,插入 \(0\) 即可。

这样,通过大根堆的维护,我们保证了第一条性质,并且如果我们将初始序列 \(sort\) 从大到小排一遍之后我们可以维护剩下两条性质

(简短证明一下:如果有一个有两个游戏个数分别为 \(i + 1\) 与 \(i\),那么有\(C_i\) 大,\(p\) 也大的这条性质,可以得到 \(sum_1 < sum_2\) ,所以一定会将新数插入大小为 \(i\) 的游戏之中)

这道题确实很妙,在官方的题解之中将一个游戏看成一个一个栈,那么这里的 \(p\) 便是这个元素在栈中的 \(h\) ,会更好理解

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 5e5 + 10; priority_queue<ll> p;
ll a[N];
int n,m;
ll ans = 0;
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> m;
for(int i = 1;i <= m + 1;i++) p.push(0);
for(int i = 1;i <= n;i++) {
cin >> a[i];
}
sort(a + 1,a + n + 1,[&](ll a,ll b) {return a > b;});
for(int i = 1;i <= n;i++) {
ll x = p.top();
ans += x;
p.pop();
p.push(x + a[i]);
}
cout << ans << '\n';
return 0;
}

Summary :

  1. 有些 (A/B) 应该考虑简单一点根据题目/题目数据来思考算法,不要先入为主
  2. 当题目用一般算法做不通的时候考虑挖掘一下性质
  3. 面对较复杂的题目时,多多运用分类讨论与同状态转换(E题题解中将游戏看作栈)的思想简化题目
  4. 以后多补题写题解以提升思维

Codeforces Round#687 Div2 题解的更多相关文章

  1. [Codeforces Round #461 (Div2)] 题解

    [比赛链接] http://codeforces.com/contest/922 [题解] Problem A. Cloning Toys          [算法] 当y = 0 ,   不可以 当 ...

  2. CodeForces round 967 div2 题解(A~E)

    本来准备比完赛就写题解的, 但是一拖拖了一星期, 唉 最后一题没搞懂怎么做,恳请大神指教 欢迎大家在评论区提问. A Mind the Gap 稳定版题面 https://cn.vjudge.net/ ...

  3. Codeforces Round #407 div2 题解【ABCDE】

    Anastasia and pebbles 题意:你有两种框,每个框可以最多装k重量的物品,但是你每个框不能装不一样的物品.现在地面上有n个物品,问你最少多少次,可以把这n个物品全部装回去. 题解:其 ...

  4. Codeforces Round #467(Div2)题解

    凌晨起来打CF,0:05,也是我第一次codeforces 第一题: 我刚开始怀疑自己读错题了,怎么会辣么水. 判除了0的数字种类 #include <cstdio> ; ]; int m ...

  5. Codeforces Round#704 Div2 题解(A,B,C,D,E)

    FST ROUND !!1 A Three swimmers: 直接整除一下向上取整就好了: #include <bits/stdc++.h> using namespace std; t ...

  6. CodeForces Round #516 Div2 题解

    A. Make a triangle! 暴力... 就是给你三个数,你每次可以选一个加1,问最少加多少次能构成三角形 #include <bits/stdc++.h> #define ll ...

  7. Codeforces Round #539 div2

    Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...

  8. Codeforces Round #543 Div1题解(并不全)

    Codeforces Round #543 Div1题解 Codeforces A. Diana and Liana 给定一个长度为\(m\)的序列,你可以从中删去不超过\(m-n*k\)个元素,剩下 ...

  9. Codeforces Round #545 Div1 题解

    Codeforces Round #545 Div1 题解 来写题解啦QwQ 本来想上红的,结果没做出D.... A. Skyscrapers CF1137A 题意 给定一个\(n*m\)的网格,每个 ...

随机推荐

  1. 书列荐书 |《黑天鹅&#183;如何应对不可预知的未来》【美】纳西姆 尼古拉斯 塔勒布 著

    你不知道的事比你知道的事更有意义,因为生活中发生了许多微小的事情,尽管出现的概率非常小,但是却以某一种巨大的力量影响我们的生活.但是由于思维习惯的问题,导致我们看问题的方式使得我们不能很快地把握事物的 ...

  2. Linux基础服务——Bind DNS服务 Part2

    Linux基础服务--Bind DNS服务 Part2 DNS反向解析与区域传送 实验环境延续Part1的实验环境. 反向区域配置 正向解析是域名到IP地址的映射,反向解析则是IP地址到域名的解析,在 ...

  3. RCNN系列、Fast-RCNN、Faster-RCNN、R-FCN检测模型对比

    RCNN系列.Fast-RCNN.Faster-RCNN.R-FCN检测模型对比 一.RCNN 问题一:速度 经典的目标检测算法使用滑动窗法依次判断所有可能的区域.本文则预先提取一系列较可能是物体的候 ...

  4. 语义分割:基于openCV和深度学习(一)

    语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...

  5. CodeGen处理Synergy方法目录

    CodeGen处理Synergy方法目录 如果Synergy应用程序开发环境包括使用Synergy/DE xfServerPlus,则可以基于Synergy方法目录中包含的元数据生成代码.要启用此功能 ...

  6. 用NVIDIA-NGC对BERT进行训练和微调

    用NVIDIA-NGC对BERT进行训练和微调 Training and Fine-tuning BERT Using NVIDIA NGC 想象一下一个比人类更能理解语言的人工智能程序.想象一下为定 ...

  7. python应用_读取Excel数据【二】_二次封装之函数式封装

    目的:想要把对Excel文件读取做成一个通用的函数式封装,便于后续简单调用,隔离复杂性. 未二次封装前原代码: #coding=gbkimport osimport xlrdcurrent_path= ...

  8. MySQL:count()用法

    语法 COUNT() 函数返回匹配指定条件的行数. COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入): SELECT CO ...

  9. 【SQLite】教程07-C/C++上使用SQLite3

    1.配置好C/C++项目环境 2.源码 1 #include <iostream> 2 #include <vector> 3 #include <string> ...

  10. OO unit1 summary

    Unit 1 summary 一.前言 三周左右的学习,OO第一单元顺利结束了,个人认为有必要写个blog来反思总结一下自己第一单元的学习情况,以便更好地进行后面的学习. 之前从来没有写blog的习惯 ...