CF 改题
改到 \(1800-2000\) 的题目吧。
2024
9月21日 Codeforces Round 974 (Div. 3)
发挥并不算好,做完 \(D\) 就困了,看完 \(E\) 也确实没有思路,\(BC\) 则是因为写代码时的奇怪疏漏各吃一发罚时,rank 1700左右。
A Robin Helps
一道比较容易的题目,由题目信息模拟即可。
#include<bits/stdc++.h>
using namespace std;
int t, n, k;
int a;
template<typename T>
inline void read(T&x){
x = 0; char q; bool f = 1;
while(!isdigit(q = getchar())) if(q == '-') f = 0;
while(isdigit(q)){
x = (x<<1) + (x<<3) + (q^48);
q = getchar();
}
x = f?x:-x;
}
template<typename T>
inline void write(T x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9) write(x/10);
putchar(x%10^48);
}
signed main(){
read(t);
while(t--){
read(n), read(k);
int ans = 0, num = 0;
for(register int i = 1; i <= n; ++i){
read(a);
if(a >= k) num += a;
if(a == 0 && num) num--, ans++;
}
write(ans), puts("");
}
return 0;
}
B Robin Hood and the Major Oak
首先需要关注的仅为奇偶性,且只用关注 \(n-k+1\) 年到 \(n\) 的叶子数即可,比赛的时候想麻烦了,明显只需要计数其中的奇数个数,若为偶则答案为偶,为奇则答案为奇。
#include<bits/stdc++.h>
using namespace std;
int t, n, k;
template<typename T>
inline void read(T&x){
x = 0; char q; bool f = 1;
while(!isdigit(q = getchar())) if(q == '-') f = 0;
while(isdigit(q)){
x = (x<<1) + (x<<3) + (q^48);
q = getchar();
}
x = f?x:-x;
}
template<typename T>
inline void write(T x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9) write(x/10);
putchar(x%10^48);
}
signed main(){
read(t);
while(t--){
read(n), read(k);
if(n <= k){
if(n%4 == 1 || n%4 == 2) puts("No");
else puts("Yes");
}
else{
if((n-k+1)%2 == 1){
if(k%4 == 1 || k%4 == 2) puts("No");
else puts("Yes");
}
else{
if(k%4 == 2 || k%4 == 3) puts("No");
else puts("Yes");
}
}
}
return 0;
}
C Robin Hood in Town
很显然当且仅当 \(n \le 2\) 的情况,无论如何也无法满足。
在 \(n\ge 3\) 时,只需要排序以后找到 \((n+2)/2\) 位的大小,并由此得到应有 \(sum\) 与先 \(sum\) 相减即可。
#include<bits/stdc++.h>
using namespace std;
int t, n;
int a[200005];
long long sum;
template<typename T>
inline void read(T&x){
x = 0; char q; bool f = 1;
while(!isdigit(q = getchar())) if(q == '-') f = 0;
while(isdigit(q)){
x = (x<<1) + (x<<3) + (q^48);
q = getchar();
}
x = f?x:-x;
}
template<typename T>
inline void write(T x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9) write(x/10);
putchar(x%10^48);
}
signed main(){
read(t);
while(t--){
read(n);
sum = 0;
for(register int i = 1; i <= n; ++i) read(a[i]), sum += a[i];
sort(a+1, a+n+1);
if(n <= 2){
puts("-1");
continue;
}
long long maxn = a[(n+2)/2];
if(sum > 2*n*maxn){
puts("0");
continue;
}
long long ans = maxn*n*2-sum+1;
write(ans), puts("");
}
return 0;
}
D Robert Hood and Mrs Hood
第一眼数颜色完全分块完全不可做,但是细看就会发现是一道比较容易处理的题目。因为题目是不带修的,所以可以以提前预处理的方式解决。只需要将每一个节点的起始任务与终止任务数提前处理,再在 \(1-n\) 跑一遍每一个点起始时的当前任务量即可。
#include<bits/stdc++.h>
using namespace std;
int t;
int n, d, k;
int st[100005], en[100005];
struct node{
int l, r;
}s[100005];
template<typename T>
inline void read(T&x){
x = 0; char q; bool f = 1;
while(!isdigit(q = getchar())) if(q == '-') f = 0;
while(isdigit(q)){
x = (x<<1) + (x<<3) + (q^48);
q = getchar();
}
x = f?x:-x;
}
template<typename T>
inline void write(T x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9) write(x/10);
putchar(x%10^48);
}
signed main(){
read(t);
while(t--){
read(n), read(d), read(k);
for(register int i = 1; i <= n; ++i) st[i] = en[i] = 0;
for(register int i = 1; i <= k; ++i){
read(s[i].l), read(s[i].r);
st[s[i].l]++, en[s[i].r]++;
}
int minn = 0, maxn = 0, ansi = 1, ansa = 1;
int now = 0;
for(register int i = 1; i <= d; ++i) now += st[i], now -= en[i-1];
minn = maxn = now;
for(register int i = 2; i <= n-d+1; ++i){
now += st[i+d-1], now -= en[i-1];
if(now < minn) minn = now, ansi = i;
if(now > maxn) maxn = now, ansa = i;
}
write(ansa), putchar(' '), write(ansi), puts("");
}
return 0;
}
E Rendez-vous de Marian et Robin
事实上 \(E\) 似乎并不难,考场上因为对边权变化和马的理解不到位没做出来。
对于相遇,显然不可能两人经过了同一个点,却在另一个点上相遇。所以两人不可能在会骑上同一匹马,无需考虑重复用马问题。同时,对于骑马以后的 \(dijkstra\) 的处理,有一个很妙的方法,即建一张新的图,所有边权都是原来的 \(\frac{1}{2}\),将有马的地方的两张图以 \(0\) 边权连接即可。

浙公网安备 33010602011771号