【反思】Sadness Fan Club Round 3 赛后反思
Sadness Fan Club Round 3 赛后反思
被薄纱了:
推歌:Bao The Whale《Cirtus Love》
小鲸鱼粉色那个皮好可爱好可爱(献花(爱心
展开目录
A 进行一个拆的解
面向数据编程
\(10pts\) Solution
特判全 \(0\) 情况,不放心的话也可以改成特判全相等
展开代码
for(int i = 1; i < n; ++i) if(a[i] != a[i + 1]) {flag = 1; break; }
if(!flag) {printf("NO\n"); continue; }
Another \(45pts\) Solution
我们可以把重复出现的每种子序列分别看成 1,2,3,...
由此可以把 \(n\) 是偶数的情况直接看成 \(n = 2\) 的情况:
n = 2
1 1
1 2
可以发现,\(n\) 是偶数时,只要把原序列从中间拆开,左侧的子序列和右侧的子序列不相等,那这个序列就可以被拆开。
特判偶数,由此可以得到一款 \(45pts\)(包含 \(subtask\ 1\) 和 \(subtask\ 2\))的代码:
展开代码
//l预处理,是 n / 2
if(!(n % 2)) {
for(int i = 1; i <= l; ++i) if(a[i] != a[i + l]) {flag = 1; break; }
if(flag) printf("YES\n");
else printf("NO\n");
} else {
for(int i = 1; i <= l; ++i) if(a[i] != a[n - i + 1]) {flag = 1; break; }
if(flag) printf("YES\n");
else printf("NO\n");
}
\(100pts\) Solution
看了一眼题解,大体是说对于 \(n\) 为单数的情况分类讨论;
我们知道分子序列的时候一定越从中间分越优,那么单数长度的序列可能分出左边的序列长或右边的序列长两种情况,那么左边长的时候就有可能包含右边,反之亦然。
由此进行模拟即可。
展开代码
#include<bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e6 + 5;
int T, n, a[N], l;
bool flag = 0;
int main() {
scanf("%d", &T);
while(T--) {
flag = 0;
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", a + i);
for(int i = 1; i < n; ++i) if(a[i] != a[i + 1]) {flag = 1; break; }
if(!flag) {printf("NO\n"); continue; }
l = n / 2;
flag = 0;
if(!(n % 2)) {
for(int i = 1; i <= l; ++i) if(a[i] != a[i + l]) {flag = 1; break; }
if(flag) printf("YES\n");
else printf("NO\n");
} else {
int mid = l + 1;
for(int i = 1; i <= l; ++i) {
while(a[i] != a[mid] && mid <= n) ++mid;
++mid;
}
if(mid >= n + 2) {printf("YES\n"); continue; }
mid = 1;
for(int i = l + 2; i <= n; ++i) {
while(a[i] != a[mid] && mid <= n) ++mid;
++mid;
}
if(mid >= n / 2 + 3) {printf("YES\n"); continue; }
printf("NO\n");
}
}
return 0;
}
B 进行一个列的排
看不懂题,咕咕咕
C 进行一个走的行
暴力出奇迹
\(10pts\) Solotion
直接暴力模拟可得优秀的 \(10pts\)
展开代码
#include<bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e6 + 5;
int n, m, a[N], b[N], v[N], x, l, r;
ll ans;
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) scanf("%d%d%d", a + i, b + i, v + i);
while(m--) {
ans = 0;
scanf("%d%d%d", &l, &r, &x);
for(int i = l; i <= r; ++i) {
if(b[i] == -1 && x - a[i] > 0) x -= a[i], ans += v[i];
if(b[i] != -1 && ((x <= b[i] && x >= a[i])||(x >= b[i] && x <= a[i]))) ans += v[i];
}
printf("%lld\n", ans);
}
return 0;
}
\(100pts\) Solution
咕咕咕
D 进行一个魔的除
应该也能暴力骗一点分,但是赛时精神状态一言难尽,所以咕咕咕
%%%: