Day 10 模拟赛 code
A
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define DB double
#define PII pair<int, int>
// #define PII pair<long long, long long>
#define fr first
#define sc second
#define mp make_pair
const int N = 1e3 + 10, M = 20 + 10, K = 2e6 + 10;
const LL P = 998244353;
int n, m;
LL c[N][N], s[N][N], mx[N][N], d[N], sd[N];
int work() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> c[i][j];
s[i][j] = s[i][j - 1] + c[i][j];
}
mx[i][m + 1] = -1e18; for (int j = m; j >= 0; j--) mx[i][j] = max(mx[i][j + 1], s[i][j]);
}
for (int i = 0; i <= m; i++) cin >> d[i];
sd[0] = d[0]; for (int i = 1; i <= m; i++) sd[i] = sd[i - 1] + d[i];
LL ans = -1e18;
for (int j = 0; j <= m; j++) {
LL sum = 0;
for (int i = 1; i <= n; i++) sum += mx[i][j];
for (int i = 1; i <= n; i++) {
ans = max(ans, sum - mx[i][j] + s[i][j] + sd[j]);
}
}
cout << ans << '\n';
return 0;
}
signed main() {
// ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
// init();
// freopen("test.in", "r", stdin);
// freopen("test.out", "w", stdout);
int T = 1;
cin >> T;
while (T--) { work(); }
return 0;
}
B
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define DB double
#define PII pair<int, int>
// #define PII pair<long long, long long>
#define fr first
#define sc second
#define mp make_pair
const int N = 2e5 + 10, M = (1 << 23) + 10, K = 2e6 + 10;
const LL P = 998244353;
int n, a[N], b[N], f[2][M], g[2][M];
int work() {
cin >> n;
int lg = __lg(n) + 2, all = ((1 << lg) - 1);
for (int j = 0; j < (1 << lg); j++) {
f[0][j] = g[0][j] = -2e9;
f[1][j] = g[1][j] = 2e9;
}
for (int i = 0; i < n; i++) cin >> a[i], f[0][i ^ all] = f[1][i ^ all] = a[i];
for (int i = 0; i < n; i++) cin >> b[i], g[0][i ^ all] = g[1][i ^ all] = b[i];
// for (int i = 0; i < n; i++) cout << " " << i << ' ' << (i ^ all) << '\n';
for (int i = 0; i < lg; i++) {
for (int j = 0; j < (1 << lg); j++) {
if((j & (1 << i))) {
f[0][j] = max(f[0][j], f[0][j ^ (1 << i)]);
g[0][j] = max(g[0][j], g[0][j ^ (1 << i)]);
f[1][j] = min(f[1][j], f[1][j ^ (1 << i)]);
g[1][j] = min(g[1][j], g[1][j ^ (1 << i)]);
}
}
}
// for (int j = 0; j < (1 << lg); j++) cout << " " << j << ' ' << f[j ^ all] << '\n';
LL ans = 0, res = -4e18;
for (int i = n - 1; i >= 0; i--) {
for (int x = 0; x < 2; x++) for (int y = 0; y < 2; y++) res = max(res, (LL)f[x][i ^ all] * g[y][i ^ all]);
// cout << i << ' ' << res << '\n';
ans = ((ans + (res % P + P) % P) % P + P) % P;
}
cout << (ans % P + P) % P << '\n';
return 0;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
// init();
// freopen("test.in", "r", stdin);
// freopen("test.out", "w", stdout);
int T = 1;
cin >> T;
while (T--) { work(); }
return 0;
}
C
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define PII pair<int, int>
// #define PII pair<long long, long long>
#define fr first
#define sc second
const int N = 2e5 + 10, M = 25;
const LL P = 998244353;
int n, a[N], g[N], f[N];
map<int, int> cnt, lst, cl, cr;
int work() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
vector<int> v;
int ml = -1, mr = -1;
for (int i = 1; i <= n; i++) {
if (cnt[a[i]] > 0) {cnt.clear(), ml = i - 1; break;}
cnt[a[i]]++;
}
cr.clear();
for (int i = n; i > 0; i--) {
if (cr[a[i]] > 0) {mr = i + 1; break;}
cr[a[i]]++;
}
if (ml == -1) {cout << 0; return 0;}
cnt.clear();
int mn = n + 1; f[n + 1] = g[n + 1] = 0;
for (int i = n; i > 0; i--) {
if (lst[a[i]] > 0) mn = min(mn, lst[a[i]]);
lst[a[i]] = i;
f[i] = f[mn] + 1;
g[i] = g[mn];
if (g[i] == 0) g[i] = i;
}
// for (int i = 1; i <= n; i++) cout << f[i] << ' ' << g[i] << '\n';
int r = mr, ans = 2e9;
for (int l = 0; l <= ml; l++) {
// cout << " " << l << ' ' << r << ' ' << f[l + 1] - 1 + (r > g[l + 1]) << '\n';
ans = min(ans, (f[l + 1] - 1 + (r > g[l + 1])) / 2 + 1);
cl[a[l + 1]]++;
while (cr[a[l + 1]] > 0 && r <= n) cr[a[r]]--, r++;
}
cout << ans;
return 0;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
// init();
// freopen("test.in", "r", stdin);
// freopen("test.out", "w", stdout);
int T = 1;
// cin >> T;
while (T--) { work(); }
return 0;
}
D
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define LL long long
#define PII pair<int, int>
// #define PII pair<long long, long long>
#define fr first
#define sc second
const int N = 5e5 + 10, M = 5e5;
const LL P = 998244353;
int n;
LL w[N];
// LL f[N][N];
namespace Treap {
mt19937 rd(114514);
const int T_SZ = 5e5 + 10;
int siz[T_SZ], ls[T_SZ], rs[T_SZ], pri[T_SZ], cnt = 0, root = 0;
LL val[T_SZ], tag[N];
void push_up(int rt) {
siz[rt] = siz[ls[rt]] + siz[rs[rt]] + 1;
}
void push_down(int rt) {
if(tag[rt]) {
val[rt] += tag[rt];
tag[ls[rt]] += tag[rt]; tag[rs[rt]] += tag[rt];
tag[rt] = 0;
}
}
void Split(int rt, int k, int &rt1, int &rt2) {
if(!rt) return (void)(rt1 = rt2 = 0);
push_down(rt);
if(k <= siz[ls[rt]]) {
Split(ls[rt], k, rt1, rt2);
ls[rt] = rt2;
push_up(rt);
rt2 = rt;
} else {
Split(rs[rt], k - siz[ls[rt]] - 1, rt1, rt2);
rs[rt] = rt1;
push_up(rt);
rt1 = rt;
}
}
int Merge(int rt1, int rt2) {
if(!rt1) return rt2;
if(!rt2) return rt1;
if(pri[rt1] < pri[rt2]) {
push_down(rt1);
rs[rt1] = Merge(rs[rt1], rt2);
push_up(rt1);
return rt1;
} else {
push_down(rt2);
ls[rt2] = Merge(rt1, ls[rt2]);
push_up(rt2);
return rt2;
}
}
LL Kth(int k) {
int rt1 = 0, rt2 = 0, rt3 = 0, c = 0;
Split(root, k, rt1, rt2);
Split(rt1, k - 1, rt3, c);
root = Merge(rt3, Merge(c, rt2));
return val[c];
}
int Rank(int rt, LL v) {
if(!rt) return 0;
push_down(rt);
if(v < val[rt]) return Rank(ls[rt], v);
else return siz[ls[rt]] + Rank(rs[rt], v) + 1;
}
void Insert(LL v) {
val[++cnt] = v, pri[cnt] = rd(), siz[cnt] = 1;
int rk = Rank(root, v), rt1 = 0, rt2 = 0;
Split(root, rk, rt1, rt2);
root = Merge(Merge(rt1, cnt), rt2);
}
void Add(LL w) {
int rk = Rank(root, w - 1);
int rt1 = 0, rt2 = 0, rt3 = 0, c = 0;
Split(root, rk, rt1, rt2);
tag[rt2] += w;
Split(rt1, rk - 1, rt3, c);
LL v = val[c];
root = Merge(Merge(rt3, c), rt2);
Insert(v + w);
}
}using namespace Treap;
int work() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> w[i];
Insert(0);
for (int i = n; i >= 1; i--) {
Add(w[i]);
}
for (int i = 1; i <= n; i++) {
cout << Kth(i + 1) << ' ';
}
return 0;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
// init();
// freopen("test.in", "r", stdin);
// freopen("test.out", "w", stdout);
int T = 1;
// cin >> T;
while (T--) { work(); }
return 0;
}