UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334)
UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334)
A Christmas Present
分析
简单比较大小即可
代码
点击查看代码
void solve () {
int n, m;
cin >> n >> m;
if (n > m) cout << "Bat" << endl;
else cout << "Glove" << endl;
return ;
}
B
分析
先直接计算,再微调
代码
点击查看代码
void solve () {
ll a, m, l, r; cin >> a >> m >> l >> r;
ll L = (l - a) / m, R = (r - a) / m;
if (l > a && (l - a) % m != 0) L ++;
if (r < a && (a - r) % m != 0) R --;
cout << R - L + 1 << endl;
return ;
}
C Socks 2
分析
贪心策略就是相邻的进行匹配,如果剩下来的总数为偶数,则直接顺序遍历给出答案,如果是奇数,则枚举是哪一个袜子没有匹配,同时通过前后缀和维护最小值
代码
点击查看代码
void solve () {
int n, k; cin >> n >> k;
vector<int> a(k + 10, 0), pre(k + 10, 0), suf(k + 10, 0);
for (int i = 1; i <= k; i ++) cin >> a[i];
for (int i = 2; i <= k; i += 2)
pre[i] = pre[i - 2] + a[i] - a[i - 1];
for (int i = k - 1; i >= 1; i -= 2)
suf[i] = suf[i + 2] + a[i + 1] - a[i];
if (k & 1) {
int ans = INF;
for (int i = 1; i <= k; i += 2) {
if (i & 1) {
ans = min(pre[i - 1] + suf[i + 1], ans);
} else {
ans = min(pre[i - 2] + suf[i + 2] + a[i + 1] - a[i - 1], ans);
}
}
cout << ans << endl;
} else {
cout << pre[k] << endl;
}
return ;
}
D Reindeer and Sleigh
分析
水题 前缀和加二分
代码
点击查看代码
void solve () {
int n, q; cin >> n >> q;
vector<ll> a(n + 1), s(n + 1, 0);
for (int i = 1; i <= n; i ++) cin >> a[i];
sort(a.begin() + 1, a.end());
for (int i = 1; i <= n; i ++) {
s[i] = s[i - 1] + a[i];
}
while (q --) {
ll x; cin >> x;
int p = upper_bound(s.begin(), s.end(), x) - s.begin() - 1;
cout << p << endl;
}
return ;
}
E Christmas Color Grid 1
分析
先求出连通块总数tot,考虑修改带来的影响,也即一个0变成1之后,连通块数量的变化,这一点可以通过维护每个点的连通块编号算出。最后用逆元算答案即可。
代码
点击查看代码
const int N = 1010;
int n, m;
string g[N];
int id[N][N];
int tot;
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
ll qmi(ll a, ll b) {
ll res = 1;
while (b) {
if (b & 1)
res = (res * a) % mod;
a = a * a % mod;
b /= 2;
}
return res;
}
void dfs(int x, int y) {
id[x][y] = tot;
for (int i = 0; i < 4; i ++) {
int xx = x + dx[i], yy = y + dy[i];
if (xx >= 0 && xx < n && yy >= 0 && yy < m && g[xx][yy] == '#' && id[xx][yy] == 0) dfs(xx, yy);
}
}
void solve () {
cin >> n >> m;
for (int i = 0; i < n; i ++)
cin >> g[i];
for (int i = 0; i < n; i ++)
for (int j = 0; j < m; j ++) {
if (!id[i][j] && g[i][j] == '#') {
tot ++;
dfs(i, j);
}
}
ll cn = 0, num = 0;
for (int i = 0; i < n; i ++) {
for (int j = 0; j < m; j ++) {
if (g[i][j] == '.') {
num ++;
set<int> s;
vector<int> v;
for (int k = 0; k < 4; k ++) {
int xx = i + dx[k], yy = j + dy[k];
if (xx >= 0 && xx < n && yy >= 0 && yy < m && id[xx][yy]) {
s.insert(id[xx][yy]);
}
}
cn += (tot - s.size() + 1);
}
}
}
cout << cn % mod * qmi(num, mod - 2) % mod << endl;
return ;
}