Codeforces Round 872 (Div. 1 & Div. 2)

发布时间 2023-05-08 22:55:30作者: SF71-H

这场寄大了。

My predictor say -101pts。

https://codeforces.com/contest/1824

https://codeforces.com/contest/1825

2A. LuoTianyi and the Palindrome String

因为给出的 \(s\) 是一个回文串,所以答案只可能是 \(-1\) 或者 \(n - 1\),只需要看一下删掉哪一个即可,然后判定,这些都是平凡的。

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
typedef long long ll;
typedef pair < int, int > PII;
typedef int itn;
mt19937 RND_MAKER (chrono :: steady_clock :: now ().time_since_epoch ().count ());
inline ll randomly (const ll l, const ll r) {return (RND_MAKER () ^ (1ull << 63)) % (r - l + 1) + l;}
//#define int long long
const double pi = acos (-1);
//__gnu_pbds :: tree < Key, Mapped, Cmp_Fn = std :: less < Key >, Tag = rb_tree_tag, Node_Upadte = null_tree_node_update, Allocator = std :: allocator < char > > ;
//__gnu_pbds :: tree < PPS, __gnu_pbds :: null_type, less < PPS >, __gnu_pbds :: rb_tree_tag, __gnu_pbds :: tree_order_statistics_node_update > tr;
inline int read () {
	int x = 0, f = 0;
	char c = getchar ();
	for ( ; c < '0' || c > '9' ; c = getchar ()) f |= (c == '-');
	for ( ; c >= '0' && c <= '9' ; c = getchar ()) x = (x << 1) + (x << 3) + (c & 15);
	return !f ? x : -x;
}
char s[55], t[55];
int n;
signed main () {
	int _ = read ();
	while (_ --) {
		scanf ("%s", s + 1);
		n = strlen (s + 1);
		int ans = -1;
		for (int i = 1;i <= n; ++ i) {
			int tot = 0;
			for (int j = 1;j <= n; ++ j) {
				if (i != j) t[++ tot] = s[j];
			}
			int ok = 1;
			for (int j = 1;j <= n - 1; ++ j) {
				ok &= (t[j] == t[n - 1 - j + 1]);
			}
			if (!ok) ans = n - 1;
		}
		printf ("%d\n", ans);
	}
}
/* PT is thinking here ...... */
/* Hope to be candidate master tonight! */

2B. LuoTianyi and the Table

我们要最大化每个前缀矩形的极差之和,那么在 \(a_{1,1},a_{1,2},a_{2,1}\) 必须放最大的,次大的,最小的,次小的,然后枚举这几种情况然后将极差之和取个 max 就行。

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
typedef long long ll;
typedef pair < int, int > PII;
typedef int itn;
mt19937 RND_MAKER (chrono :: steady_clock :: now ().time_since_epoch ().count ());
inline ll randomly (const ll l, const ll r) {return (RND_MAKER () ^ (1ull << 63)) % (r - l + 1) + l;}
#define int long long
const double pi = acos (-1);
//__gnu_pbds :: tree < Key, Mapped, Cmp_Fn = std :: less < Key >, Tag = rb_tree_tag, Node_Upadte = null_tree_node_update, Allocator = std :: allocator < char > > ;
//__gnu_pbds :: tree < PPS, __gnu_pbds :: null_type, less < PPS >, __gnu_pbds :: rb_tree_tag, __gnu_pbds :: tree_order_statistics_node_update > tr;
inline int read () {
	int x = 0, f = 0;
	char c = getchar ();
	for ( ; c < '0' || c > '9' ; c = getchar ()) f |= (c == '-');
	for ( ; c >= '0' && c <= '9' ; c = getchar ()) x = (x << 1) + (x << 3) + (c & 15);
	return !f ? x : -x;
}
int n, m, b[10005], a[105][105];
inline int f () {
	int ans = 0;
	ans += a[1][1];
	ans += max (a[1][1], a[1][2]) * (m - 1);
	ans += max (a[1][1], a[2][1]) * (n - 1);
	ans += max ({a[1][1], a[1][2], a[2][1]}) * (n - 1) * (m - 1);
	ans -= a[1][1];
	ans -= min (a[1][1], a[1][2]) * (m - 1);
	ans -= min (a[1][1], a[2][1]) * (n - 1);
	ans -= min ({a[1][1], a[1][2], a[2][1]}) * (n - 1) * (m - 1);
//	if (ans == 12) {
//		printf ("a[1][1] = %lld, a[1][2] = %lld, a[2][1] = %lld\n", a[1][1], a[1][2], a[2][1]);
//	}
	return ans;
}
signed main () {
	int _ = read ();
	while (_ --) {
		n = read (), m = read ();
		int ans = -9e18;
		for (int i = 1;i <= n * m; ++ i) b[i] = read ();
		sort (b + 1, b + 1 + n * m);
		a[1][1] = b[n * m], a[1][2] = b[1], a[2][1] = b[2], ans = max (ans, f ());
		a[1][1] = b[n * m], a[1][2] = b[2], a[2][1] = b[1], ans = max (ans, f ());
		a[1][1] = b[1], a[1][2] = b[n * m], a[2][1] = b[n * m - 1], ans = max (ans, f ());
		a[1][1] = b[1], a[1][2] = b[n * m - 1], a[2][1] = b[n * m], ans = max (ans, f ());
		printf ("%lld\n", ans);
	}
	return 0;
}
/* PT is thinking here ...... */
/* Hope to be candidate master tonight! */

2C/1A. LuoTianyi and the Show

这题费了我 80min & penalty*3 /fn /fn /fn。

思路想了好久才想对,一开始想的是 \(-1\)\(-2\) 一定连在一起用,然后就对着错的思路搞了 1h /fn /fn /fn。

发现我们可以分成三种情况处理:

  • 只用 \(-2\)。从 \(1\)\(m\) 扫一遍,如果有 \(i\) 就直接用,否则花费一个 \(-2\)

  • 只用 \(-1\)。从 \(m\)\(1\) 扫一遍,如果有 \(i\) 就直接用,否则花费一个 \(-1\)

  • \(-1\)\(-2\) 都用。钦定一个至少出现 \(1\) 次的 \(i\)\(1 \sim i\)\(-1\),有空隙就可以插一个 \(-1\) 进去。\(i + 1 \sim m\)\(-2\),有空隙就插一个 \(-2\) 进去。

自己复了复盘,