目录
比赛链接:
Dashboard - Codeforces Round 970 (Div. 3) - Codeforces
A. Sakurako's Exam
当1为奇数和2为奇数时,1是的数量小于2时输出NO,反之输出YES。
void solve()
{
int a, b;
cin >> a >> b;
if (a & 1) {
cout << "NO\n";
return;
}
if (b & 1) {
if (a >= 2) {
cout << "YES\n";
}
else {
cout << "NO\n";
}
}
else {
cout << "YES\n";
}
}
B. Square or Not
n必须是平方数,然后模拟一下,中间全部是0即可。
int ok(int x) {
int k = sqrt(x);
if (k * k == x) return true;
else return false;
}
void solve()
{
int n;
cin >> n;
string s;
cin >> s;
s = '.' + s;
bool Ok = true;
if (ok(n)) {
n = sqrt(n);
for (int i = 1; i <= n; i++) if (s[i] != '1') Ok = false;
for (int i = n*n-n; i <= n*n; i++) if (s[i] != '1') Ok = false;
for (int i = n+1; i <= n * n - n; i++) {
int k = (i) % n;
if (k == 1 || k == 0) {
if (s[i] != '1') Ok = false;
}
else {
if (s[i] != '0') Ok = false;
}
}
if (Ok) cout << "YES\n";
else cout << "NO\n";
}
else {
cout << "NO\n";
}
}
C. Longest Good Array
这数据范围,感觉这题比第一题简单。
void solve()
{
int l, r;
cin >> l >> r;
int st = 0;
int ans = 0;
for (int i = l; i <= r; i += st) {
ans++;
st++;
}
cout << ans << '\n';
}
D. Sakurako's Hobby
就是从i位置出发,经过的位置有多少为0,并查集
int pre[N];
int Find(int x)
{
if (x == pre[x]) return x;
return pre[x] = Find(pre[x]);
}
void solve()
{
int n;
cin >> n;
vector<int>a(n + 1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
pre[i] = i;
}
string s;
cin >> s;
s = '.' + s;
vector<int>ans(n + 1);
for (int i = 1; i <= n; i++) {
if (s[i] == '0')
ans[i] = 1;
}
for (int i = 1; i <= n; i++) {
int x = Find(i), y = Find(a[i]);
if (x != y) {
pre[y] = x;
ans[x]+=ans[y];
}
}
for (int i = 1; i <= n; i++) {
cout <<ans[Find(i)] << ' ';
}
cout << '\n';
}
E. Alternating String
因为删除操作只能进行一次,所以n为奇数时,必须执行一次删除操作,n为偶数时,则不用删除,如果判断此时奇偶为数量最多的字母即可,我们要做的就是将奇欧位全部字母变成数量最多的字母需要的操作数即可,更新最小值。
void solve()
{
int n;
cin >> n;
string s;
cin >> s;
s = ' ' + s;
vector<vector<int>>a(n + 1), b(n + 1);
a[0].resize(26);
b[0].resize(26);
for (int i = 1; i <= n; i++)
{
a[i].resize(26);
b[i].resize(26);
for (int j = 0; j < 26; j++)
{
a[i][j] += a[i - 1][j];
b[i][j] += b[i - 1][j];
}
if (i % 2)
{
a[i][s[i] - 'a']++;
}
else {
b[i][s[i] - 'a']++;
}
}
if (n % 2 == 0)
{
int ans = 0;
for (int i = 0; i < 26; i++)
{
for (int j = 0; j < 26; j++)
{
ans = max(ans, a[n][i] + b[n][j]);
}
}
cout << n - ans << "\n";
}
else {
int ans = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < 26; j++)
{
for (int k = 0; k < 26; k++)
{
ans = max(ans, a[i - 1][j] + b[n][j] - b[i][j] + b[i - 1][k] + a[n][k] - a[i][k]);
}
}
}
cout << n - ans << "\n";
}
}
F. Sakurako's Box
前缀和+逆元
int qpow(int base, int power, int P)
{
int res = 1;
while (power)
{
if (power & 1) res = (res * base) % P;
base = (base * base) % P;
power >>= 1;
}
return res;
}
int n, a[N];
void solve()
{
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
int sum = 0;
for (int i = 1; i <= n; ++i) sum += a[i];
int ans = 0;
for (int i = 1; i <= n; ++i)
{
sum -= a[i];
ans += sum % mod * a[i] % mod;
}
printf("%lld\n", ans % mod * qpow(1ll * n * (n - 1) / 2 % mod, mod - 2, mod) % mod);
}