Codeforces Round 952 (Div. 4) (A - H2)
Codeforces Round 952 (Div. 4)
A#
void solve() {
string s, t; cin >> s >> t;
swap(s[0], t[0]);
cout << s << ' ' << t << '\n';
}
B#
原数据范围枚举足矣。
进一步分析性质:
对于较小的
void solve() {
int n;
std::cin >> n;
if (n == 3) {
std::cout << 3 << "\n";
} else {
std::cout << 2 << "\n";
}
}
// by jiangly
C#
设当前前缀和为
void solve() {
int n; cin >> n;
ll s = 0, ans = 0;
map<ll, int> mp;
for(int i = 1, x; i <= n; ++ i) {
cin >> x;
mp[x] = 1;
s += x;
if(s % 2 == 0) {
ans += mp[s / 2];
}
}
cout << ans << '\n';
}
D#
题目保证了是完整的圆。找到左右边界即可。
void solve() {
int n, m; cin >> n >> m;
int mx[2] = {1, 1}, mi[2] = {n, m};
for(int i = 0; i < n; ++ i) {
string s; cin >> s;
for(int j = 0; j < m; ++ j) {
if(s[j] == '#') {
mx[0] = max(mx[0], i + 1);
mi[0] = min(mi[0], i + 1);
mx[1] = max(mx[1], j + 1);
mi[1] = min(mi[1], j + 1);
}
}
}
cout << (mx[0] + mi[0]) / 2 << ' ' << (mx[1] + mi[1]) / 2 << '\n';
}
E#
枚举
void solve() {
ll x, y, z, k; cin >> x >> y >> z >> k;
ll ans = 0;
for(int a = 1; a <= x; ++ a) {
for(int b = 1; b <= y; ++ b) {
ll c = k / a / b;
if(c * a * b != k || c > z) continue;
ans = max(ans, (x - a + 1) * (y - b + 1) * (z - c + 1));
}
}
cout << ans << '\n';
}
F#
二分时间
bool check(ll v) {
__int128 s = 0;
for(int i = 1; i <= n; ++ i) {
s += a[i] * __int128((v - 1) / c[i] + 1);
}
return s >= h;
}
void solve() {
cin >> h >> n;
for(int i = 1; i <= n; ++ i) cin >> a[i];
for(int i = 1; i <= n; ++ i) cin >> c[i];
ll l = 1, r = 1e18;
while(l < r) {
ll mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
cout << l << '\n';
}
G#
记
符合条件的数字长度
void solve() {
cin >> l >> r >> k;
if(k >= 10) {
cout << 0 << '\n';
return;
}
ll x = 9 / k + 1;
ll ans = (qpow(x, r) - qpow(x, l)) % P;
if(ans < 0) ans += P;
cout << ans << '\n';
}
H1#
只考虑行,列同理处理。
定义行
对于一个大小为
最后答案为
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
void solve() {
int n, m; cin >> n >> m;
vector<string> g(n);
for(int i = 0; i < n; ++ i) {
cin >> g[i];
}
vector<int> r(n, 0);
vector<int> c(m, 0);
vector id(n, vector<int>(m, 0));
auto ck = [&](int x, int y) {
return x >= 0 && x < n && y >= 0 && y < m;
};
int idx = 0;
vector<int> cnt_r(n, 0);
vector<int> cnt_c(m, 0);
vector<int> st_r(n, 0);
vector<int> st_c(m, 0);
for(int i = 0; i < n; ++ i) {
for(int j = 0; j < m; ++ j) {
if(!id[i][j] && g[i][j] == '#') {
id[i][j] = ++ idx;
queue<pair<int, int>> q;
vector<pair<int, int>> a;
q.eb(i, j);
while(!q.empty()) {
auto [x, y] = q.front(); q.pop();
++ cnt_r[x];
++ cnt_c[y];
a.pb(x, y);
for(int k = 0; k < 4; ++ k) {
int nx = x + dx[k], ny = y + dy[k];
if(ck(nx, ny) && !id[nx][ny] && g[nx][ny] == '#') {
q.eb(nx, ny);
id[nx][ny] = idx;
}
}
}
for(auto [x, y] : a) {
if(!st_r[x]) {
st_r[x] = 1;
r[x] += a.size() - cnt_r[x];
}
if(!st_c[y]) {
st_c[y] = 1;
c[y] += a.size() - cnt_c[y];
}
for(int k = 0; k < 4; ++ k) {
int nx = x + dx[k], ny = y + dy[k];
if(ck(nx, ny)) {
if(!st_r[nx]) {
st_r[nx] = 1;
r[nx] += a.size() - cnt_r[nx];
}
if(!st_c[ny]) {
st_c[ny] = 1;
c[ny] += a.size() - cnt_c[ny];
}
}
}
}
for(auto [x, y] : a) {
st_r[x] = st_c[y] = 0;
-- cnt_r[x];
-- cnt_c[y];
for(int k = 0; k < 4; ++ k) {
int nx = x + dx[k], ny = y + dy[k];
if(ck(nx, ny)) {
st_r[nx] = st_c[ny] = 0;
}
}
}
}
}
}
int ans = max(n, m);
for(int i = 0; i < n; ++ i) {
ans = max(ans, m + r[i]);
}
for(int j = 0; j < m; ++ j) {
ans = max(ans, n + c[j]);
}
cout << ans << '\n';
}
H2#
和 H1 思路一致。
设
把
如果一个
重复计算了
枚举
连通块大小是
upd:最坏复杂度
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
void solve() {
int n, m; cin >> n >> m;
vector<string> g(n);
for(int i = 0; i < n; ++ i) {
cin >> g[i];
}
vector<int> r(n, 0);
vector<int> c(m, 0);
vector rc(n, vector<int>(m, 0));
vector id(n, vector<int>(m, 0));
auto ck = [&](int x, int y) {
return x >= 0 && x < n && y >= 0 && y < m;
};
int idx = 0;
vector<int> cnt_r(n, 0);
vector<int> cnt_c(m, 0);
vector cnt_rc(n, vector<int>(m, 0));
vector<int> st_r(n, 0);
vector<int> st_c(m, 0);
for(int i = 0; i < n; ++ i) {
for(int j = 0; j < m; ++ j) {
if(!id[i][j] && g[i][j] == '#') {
id[i][j] = ++ idx;
queue<pair<int, int>> q;
vector<pair<int, int>> a;
q.eb(i, j);
while(!q.empty()) {
auto [x, y] = q.front(); q.pop();
++ cnt_r[x];
++ cnt_c[y];
++ cnt_rc[x][y];
a.pb(x, y);
for(int k = 0; k < 4; ++ k) {
int nx = x + dx[k], ny = y + dy[k];
if(ck(nx, ny) && !id[nx][ny] && g[nx][ny] == '#') {
q.eb(nx, ny);
id[nx][ny] = idx;
}
}
}
vector<int> X, Y;
for(auto [x, y] : a) {
if(!st_r[x]) {
st_r[x] = 1;
r[x] += a.size() - cnt_r[x];
X.pb(x);
}
if(!st_c[y]) {
st_c[y] = 1;
c[y] += a.size() - cnt_c[y];
Y.pb(y);
}
for(int k = 0; k < 4; ++ k) {
int nx = x + dx[k], ny = y + dy[k];
if(ck(nx, ny)) {
if(!st_r[nx]) {
st_r[nx] = 1;
r[nx] += a.size() - cnt_r[nx];
X.pb(nx);
}
if(!st_c[ny]) {
st_c[ny] = 1;
c[ny] += a.size() - cnt_c[ny];
Y.pb(ny);
}
}
}
}
for(auto x : X) {
for(auto y : Y) {
if(ck(x, y)) {
rc[x][y] += a.size() - cnt_rc[x][y];
}
}
}
for(auto [x, y] : a) {
st_r[x] = st_c[y] = 0;
-- cnt_r[x];
-- cnt_c[y];
-- cnt_rc[x][y];
for(int k = 0; k < 4; ++ k) {
int nx = x + dx[k], ny = y + dy[k];
if(ck(nx, ny)) {
st_r[nx] = st_c[ny] = 0;
}
}
}
}
}
}
int ans = n + m - 1;
for(int i = 0; i < n; ++ i) {
for(int j = 0; j < m; ++ j) {
int tmp = n + m - 1;
ans = max(ans, tmp + r[i] + c[j] - rc[i][j]);
}
}
cout << ans << '\n';
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】