The 2023 ICPC Asia Jinan Regional Contest (The 2nd Universal Cup. Stage 17: Jinan)
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
using i64 = long long;
namespace Set {
const int kInf = INT_MAX / 2;
i64 sum1, sum2;
int sz1, sz2;
multiset<int> less, greater;
void init() {
sum1 = sum2 = sz1 = sz2 = 0;
less.clear(), greater.clear();
less.insert(-kInf), greater.insert(kInf);
}
void adjust() {
while (less.size() > greater.size() + 1) {
multiset<int>::iterator it = (--less.end());
greater.insert(*it);
less.erase(it);
sum1 -= *it; sum2 += *it;
sz1--; sz2++;
}
while (greater.size() > less.size()) {
multiset<int>::iterator it = greater.begin();
less.insert(*it);
greater.erase(it);
sum1 += *it; sum2 -= *it;
sz1++; sz2--;
}
}
void add(int val_) {
if (val_ <= *greater.begin()) {
sum1 += val_; sz1++;
less.insert(val_);
} else {
sum2 += val_; sz2++;
greater.insert(val_);
}
adjust();
}
void del(int val_) {
multiset<int>::iterator it = less.lower_bound(val_);
if (it != less.end()) {
less.erase(it);
sum1 -= *it;
sz1--;
} else {
it = greater.lower_bound(val_);
greater.erase(it);
sum2 -= *it;
sz2--;
}
adjust();
}
int get_middle() {
return *less.rbegin();
}
}
void solve() {
i64 n, k; cin >> n >> k;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
a[i] -= i;
}
Set::init();
auto check = [&]() {
i64 v = Set::get_middle();
i64 sum = v * Set::sz1 - Set::sum1 + Set::sum2 - v * Set::sz2;
return sum <= k;
};
i64 ans = 0;
for (int i = 1, j = 1; i <= n; i++) {
Set::add(a[i]);
while (j < i && !check()) {
Set::del(a[j]);
j++;
}
ans = max(ans, (i64)Set::sz1 + (i64)Set::sz2);
} cout << ans << endl;
}
int main() {
cin.tie(nullptr) -> ios::sync_with_stdio(false);
int T; cin >> T;
while (T--) solve();
return 0;
}
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
using i64 = long long;
const int mod = 1e9 + 7;
void solve() {
int n, m; cin >> n >> m;
vector<vector<char>> a(n + 1, vector<char>(m + 1));
vector<vector<int>> vis(m + 1);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
if (a[i][j] == '1') vis[j].push_back(i);
}
}
vector<int> fa(2 * n + 1);
for (int i = 1; i <= 2 * n; i++) {
fa[i] = i;
}
function<int(int)> Find = [&](int x) {
return x == fa[x] ? x : fa[x] = Find(fa[x]);
};
for (int i = 1; i <= m; i++) {
int all = vis[i].size() + vis[m + 1 - i].size();
if (all <= 1) continue;
else if (all >= 3) {cout << 0 << endl; return;}
if (vis[i].size() == 2) {
int id1 = vis[i][0] + n, id2 = vis[i][1];
id1 = Find(id1); id2 = Find(id2);
if (id1 != id2) fa[id2] = id1;
id1 = vis[i][0], id2 = vis[i][1] + n;
id1 = Find(id1); id2 = Find(id2);
if (id1 != id2) fa[id2] = id1;
} else if (vis[m + 1 - i].size() == 2) {
int id1 = vis[m + 1 - i][0] + n, id2 = vis[m + 1 - i][1];
id1 = Find(id1); id2 = Find(id2);
if (id1 != id2) fa[id2] = id1;
id1 = vis[m + 1 - i][0], id2 = vis[m + 1 - i][1] + n;
id1 = Find(id1); id2 = Find(id2);
if (id1 != id2) fa[id2] = id1;
} else {
int id1 = vis[m + 1 - i][0], id2 = vis[i][0];
id1 = Find(id1); id2 = Find(id2);
if (id1 != id2) fa[id2] = id1;
id1 = vis[m + 1 - i][0] + n, id2 = vis[i][0] + n;
id1 = Find(id1); id2 = Find(id2);
if (id1 != id2) fa[id2] = id1;
}
}
auto ksm = [&](i64 a, i64 b) {
i64 ans = 1 % mod;
a %= mod;
while (b) {
if (b & 1) ans = (ans * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return ans;
};
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (fa[i] == i) cnt++;
if (Find(i) == Find(i + n)) {
cout << 0 << endl;
return;
}
}
cout << ksm(2, cnt) << endl;
}
signed main() {
cin.tie(nullptr) -> ios::sync_with_stdio(false);
int T; cin >> T;
while (T--) solve();
return 0;
}
The 2023 ICPC Asia Shenyang Regional Contest (The 2nd Universal Cup. Stage 13: Shenyang)
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
using i64 = long long;
const int N = 105;
int f[N][N][N][2], vis[N][N][N][2];
void solve() {
int x, y, p, q; cin >> x >> y >> p >> q;
queue<array<int, 4>> Q;
memset(f, 127, sizeof f);
Q.push({x, y, 0, 0});
f[x][y][0][0] = 0;
auto check = [&](int l1, int l2) {
return !l1 || (l1 && l1 + q >= l2);
};
int ans = INT_MAX / 2;
while (!Q.empty()) {
auto [v1, v2, v3, op] = Q.front(); Q.pop();
if (vis[v1][v2][v3][op]) continue;
vis[v1][v2][v3][op] = 1;
int v4 = y - v2;
if (v3 == x) {
ans = min(ans, f[v1][v2][v3][op]);
}
for (int i = 0; i <= (op ? v3 : v1); i++) {
for (int j = 0; j <= (op ? v4 : v2); j++) {
if (i + j > p) continue;
if (!op) {
int l1 = v1 - i, l2 = v2 - j;
if (check(l1, l2) && !vis[l1][l2][v3 + i][op ^ 1]) {
Q.push({l1, l2, v3 + i, op ^ 1});
f[l1][l2][v3 + i][op ^ 1] = min(f[l1][l2][v3 + i][op ^ 1], f[v1][v2][v3][op] + 1);
}
} else {
int l1 = v3 - i, l2 = v4 - j;
if (check(l1, l2) && !vis[v1 + i][v2 + j][l1][op ^ 1]) {
Q.push({v1 + i, v2 + j, l1, op ^ 1});
f[v1 + i][v2 + j][l1][op ^ 1] = min(f[v1 + i][v2 + j][l1][op ^ 1], f[v1][v2][v3][op] + 1);
}
}
}
}
}
cout << (ans == INT_MAX / 2 ? -1 : ans) << endl;
}
int main() {
cin.tie(nullptr) -> ios::sync_with_stdio(false);
solve();
return 0;
}
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
const int N = 4e5 + 100;
int a[N];
vector<int> vec;
struct node {
int cnt;
i64 sum;
} Seg[N * 4];
node operator + (const node &l, const node &r) {
node ans; ans.cnt = l.cnt + r.cnt;
ans.sum = l.sum + r.sum;
return ans;
}
void pushup(int id) {
Seg[id] = Seg[id * 2] + Seg[id * 2 + 1];
}
void build(int id, int l, int r) {
if (l == r) {
Seg[id] = {0, 0};
return;
}
int mid = l + r >> 1;
build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r);
pushup(id);
}
void modify(int id, int l, int r, int pos, int v) {
if (l == r) {
Seg[id].sum += v * vec[l - 1];
Seg[id].cnt += v;
return;
}
int mid = l + r >> 1;
if (pos <= mid) modify(id * 2, l, mid, pos, v);
else modify(id * 2 + 1, mid + 1, r, pos, v);
pushup(id);
}
pair<int, int> query1(int id, int l, int r, int v) {
if (l == r) return {l, Seg[id].cnt};
int mid = l + r >> 1;
if (Seg[id * 2].sum > v) return query1(id * 2, l, mid, v);
else return query1(id * 2 + 1, mid + 1, r, v - Seg[id * 2].sum);
}
node query2(int id, int l, int r, int x, int y) {
if (x <= l && y >= r) return Seg[id];
int mid = l + r >> 1;
node ans = {0, 0};
if (x <= mid) ans = ans + query2(id * 2, l, mid, x, y);
if (y > mid) ans = ans + query2(id * 2 + 1, mid + 1, r, x, y);
return ans;
}
void solve() {
int n, q; cin >> n >> q;
vec.clear();
for (int i = 1; i <= n; i++) {
cin >> a[i];
vec.push_back(a[i]);
}
vector<array<int, 2>> que(q + 1);
for (int i = 1; i <= q; i++) {
int x, v; cin >> x >> v;
que[i] = {x, v};
vec.push_back(v);
}
vec.push_back(-1e9 - 1); vec.push_back(1e9 + 1);
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
auto getid = [&](int x) {
return lower_bound(vec.begin(), vec.end(), x) - vec.begin() + 1;
};
int m = vec.size(), z = 0;
i64 res = 0;
build(1, 1, m);
for (int i = 1; i <= n; i++) {
int id = getid(a[i]);
if (a[i] > 0) z++;
modify(1, 1, m, id, 1);
res += a[i];
}
for (int i = 1; i <= q; i++) {
auto [x, v] = que[i];
int id1 = getid(a[x]), id2 = getid(v);
res += v - a[x];
if (a[x] > 0) z--;
if (v > 0) z++;
modify(1, 1, m, id1, -1);
a[x] = v;
modify(1, 1, m, id2, 1);
auto [pos, cnt] = query1(1, 1, m, 0);
auto [num, sum] = query2(1, 1, m, 1, pos);
// cout << "TEST" << endl;
// for (int j = 1; j <= n; j++) {
// cout << a[j] << " \n"[j == n];
// }
// cout << vec[pos - 1] << ' ' << cnt << ' ' << num << ' ' << sum << endl;
if (res <= 0) {
cout << z + 1 << '\n';
continue;
}
int L = 0, R = cnt;
auto check = [&](int V) {
return sum - V * vec[pos - 1] > 0;
};
while (L + 1 < R) {
int M = L + R >> 1;
if (check(M)) L = M;
else R = M;
}
int p = check(R) ? R : L;
p = num - p + 1;
cout << z - (n - p + 1) << '\n';
// cout << "TEST " << i << ' ' << z << endl;
}
}
signed main() {
cin.tie(nullptr) -> ios::sync_with_stdio(false);
solve();
return 0;
}
The 2023 ICPC Asia Hangzhou Regional Contest (The 2nd Universal Cup. Stage 22: Hangzhou)
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
const int N = 5e5 + 100;
const int mod = 1e9 + 7;
vector<int> g[N];
int a[N], b[N], w[N];
void solve() {
int n; cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
for (int i = 1; i <= n; i++) cin >> w[i];
vector<int> tmp;
for (int i = 1; i <= n; i++) {
int l = a[b[i]], r = a[b[i]] + w[b[i]];
if (a[i] >= r) {
continue;
} else if (a[i] < l) {
g[b[i]].push_back(i);
tmp.push_back(i);
} else {
g[b[i]].push_back(i);
}
}
vector<int> dist(n + 1, 1e9), vis(n + 1);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
for (auto i : tmp) {
dist[i] = 0;
q.push({0, i});
}
while (!q.empty()) {
auto [v, x] = q.top(); q.pop();
if (vis[x]) continue;
vis[x] = 1;
for (auto y : g[x]) {
if (vis[y]) continue;
if (dist[y] > dist[x] + 1) {
dist[y] = dist[x] + 1;
q.push({dist[y], y});
}
}
}
auto ksm = [&](i64 a, i64 b) {
i64 ans = 1 % mod;
a %= mod;
while (b) {
if (b & 1) ans = (ans * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return ans;
};
vector<int> p(n + 1);
int v = 1;
for (int i = 1; i <= n; i++) {
v *= i; v %= mod;
p[i] = ksm(v, mod - 2);
}
// cout << "TEST" << endl;
for (int i = 1; i <= n; i++) {
// cout << i << ' ' << dist[i] << endl;
int ans = a[i];
if (dist[i] < (int)1e9) {
ans = (ans + p[dist[i] + 1] * w[i] % mod) % mod;
}
cout << ans << " \n"[i == n];
}
for (int i = 1; i <= n; i++) {
g[i].clear();
}
}
signed main() {
cin.tie(nullptr) -> ios::sync_with_stdio(false);
int T; cin >> T;
while (T--) {
solve();
}
return 0;
}
点击查看代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
using u64 = unsigned long long;
const int N = 3005;
char a[N][N];
int X[N * 100], Y[N * 100], bel[N][N], dist[N][N], vis[N][N];
int dir[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
void solve() {
int n, m, k; cin >> n >> m >> k;
for (int i = 1; i <= k; i++) {
cin >> X[i] >> Y[i];
bel[X[i]][Y[i]] = i;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
memset(dist, 127, sizeof dist);
priority_queue<array<int, 3>, vector<array<int, 3>>, greater<array<int, 3>>> q;
dist[X[1]][Y[1]] = 0;
q.push({0, X[1], Y[1]});
while (!q.empty()) {
auto [v, x, y] = q.top(); q.pop();
if (vis[x][y]) continue;
vis[x][y] = 1;
for (int i = 0; i < 4; i++) {
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && a[nx][ny] != '#' && !vis[nx][ny]) {
if (bel[nx][ny]) {
int del = k - bel[nx][ny];
if (dist[x][y] >= del) {
if (dist[x][y] + 1 < dist[nx][ny]) {
dist[nx][ny] = dist[x][y] + 1;
q.push({dist[nx][ny], nx, ny});
}
} else {
if (dist[x][y] + 1 + del - dist[x][y] < dist[nx][ny]) {
dist[nx][ny] = dist[x][y] + 1 + del - dist[x][y];
q.push({dist[nx][ny], nx, ny});
}
}
} else {
if (dist[x][y] + 1 < dist[nx][ny]) {
dist[nx][ny] = dist[x][y] + 1;
q.push({dist[nx][ny], nx, ny});
}
}
}
}
}
u64 ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (dist[i][j] < 1 << 30) {
ans += (u64)dist[i][j] * dist[i][j];
// cout << dist[i][j] << " \n"[j == n];
}
}
}
cout << ans << endl;
}
int main() {
cin.tie(nullptr) -> ios::sync_with_stdio(false);
solve();
return 0;
}