【第1题】CF900C Remove Extra One
碎碎念
本周开始记录所做的每一道题,今年的目标任重道远,继续加油!
封面的小脚印要回溯到我10年前了,时光荏苒,我已经成为一名小码匠了。
分类 | 合计 | 普及- | 普及/提高- | 普及+/提高 | 提高+/省选- | 省选/NOI- | NOI/NOI+/CTSC | 未评级 |
---|---|---|---|---|---|---|---|---|
354 | 30 | 87 | 131 | 59 | 19 | 3 | 25 | |
完成 | 2 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
未完成 | 352 | 30 | 86 | 130 | 59 | 19 | 3 | 25 |
题目
题目原文请移步下面的链接
- https://www.luogu.com.cn/problem/CF900C
- 参考题解:https://www.luogu.com.cn/problem/solution/CF900C
- 标签:
Codeforces
、数据结构
、树状数组
题解
思路
- 共分三种情况
- 它本身已经是record,那么无论去掉那个数,它都还是一个record,则record的数量会 -1
- 如果某个数的前面只有一个数大于它,那么去掉这个数即为最优解
- 如果某个数的前面有两个或两个以上的数大于它则它必定不能成为record,此时寻求record最多的子序列并去掉它前面大于它的那个数即可
- 易错点
- 数字存储的索引必须从1开始,因为如果正解为第一个数,但索引从0开始存储会导致第一个数永远都无法成为正解
- 数组d的第一个值(即为索引为0的值)应设置为一个很小的数,否则会导致最后判断时于特殊值(比如n=1, p={1})时出现故障
代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n';
void best_coder() {
int n;
scanf("%d", &n);
vector<int> a(n + 1);
vector<int> d(n + 1);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
int x = 0, y = 0;
for (int i = 1; i <= n; ++i) {
if (a[i] > a[y]) {
x = y;
y = i;
--d[i];
} else if (a[i] > a[x]) {
++d[y];
x = i;
}
}
int k = 0;
d[0] = -10000000;
for (int i = 1; i <= n; ++i) {
if (d[i] > d[k] || (d[i] == d[k] && a[i] < a[k])) {
k = i;
}
}
printf("%d", a[k]);
}
void happy_coder() {
}
int main() {
// 提升cin、cout效率
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// 小码匠
best_coder();
// 最优解
// happy_coder();
// 返回
return 0;
}
参考代码
这个是题解的参考代码,我最早提交的时候,下面这点没考虑到,除了这点,代码几乎一个模子。OIer真是有默契…
- 易错点:数字存储的索引必须从1开始,因为如果正解为第一个数,但索引从0开始存储会导致第一个数永远都无法成为正解
#include <bits/stdc++.h>
using namespace std;
int n;
int a[100010];
int delta[100010];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int x = 0, y = 0;//x=second largest,y=largest
for (int i = 1; i <= n; i++) {
if (a[i] > a[y]) {//record now
x = y;
y = i;
delta[i]--;
} else if (a[i] > a[x]) {//depends on y
delta[y]++;
x = i;
}
}
int id = 0;
delta[0] = -1000000;
for (int i = 1; i <= n; i++) {
if (delta[i] > delta[id] || (delta[i] == delta[id] && a[i] < a[id])) id = i;
}
cout << a[id];
return 0;
}