A
#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
#define mp make_pair
const int N = 2e5 + 10, M = 32;
const LL P = 998244353;
int n, a[N], cnt1[M], cnt2[M][M], cnt3[M][M][M], cnt4[M][M][M][M];
int c[N], id[N][4];
int work() {
memset(c, 0, (n + 5) * sizeof(int)); memset(id, 0, (n + 5) * sizeof(int[4]));
cin >> n;
LL ans = (LL)n * (LL)(n - 1) / 2;
for (int i = 1; i <= n; i++) {
cin >> a[i];
for (int j = 0; j <= 30; j++) if ((a[i] >> j) & 1) id[i][c[i]++] = j;
if (c[i] >= 1) {
for (int j = 0; j < c[i]; j++) ans += cnt1[id[i][j]];
} if (c[i] >= 2) {
for (int j = 0; j < c[i] - 1; j++) {
for (int k = j + 1; k < c[i]; k++) {
ans -= cnt2[id[i][j]][id[i][k]];
}
}
} if (c[i] >= 3) {
for (int j = 0; j < c[i] - 2; j++) {
for (int k = j + 1; k < c[i] - 1; k++) {
for (int l = k + 1; l < c[i]; l++)
ans += cnt3[id[i][j]][id[i][k]][id[i][l]];
}
}
} if (c[i] >= 4) {
for (int j = 0; j < c[i] - 3; j++) {
for (int k = j + 1; k < c[i] - 2; k++) {
for (int l = k + 1; l < c[i] - 1; l++)
for (int m = l + 1; m < c[i]; m++)
ans -= cnt4[id[i][j]][id[i][k]][id[i][l]][id[i][m]];
}
}
}
if (c[i] >= 1) {
for (int j = 0; j < c[i]; j++) cnt1[id[i][j]]++;
} if (c[i] >= 2) {
for (int j = 0; j < c[i] - 1; j++) {
for (int k = j + 1; k < c[i]; k++) {
cnt2[id[i][j]][id[i][k]]++;
}
}
} if (c[i] >= 3) {
for (int j = 0; j < c[i] - 2; j++) {
for (int k = j + 1; k < c[i] - 1; k++) {
for (int l = k + 1; l < c[i]; l++)
cnt3[id[i][j]][id[i][k]][id[i][l]]++;
}
}
} if (c[i] >= 4) {
for (int j = 0; j < c[i] - 3; j++) {
for (int k = j + 1; k < c[i] - 2; k++) {
for (int l = k + 1; l < c[i] - 1; l++)
for (int m = l + 1; m < c[i]; m++)
cnt4[id[i][j]][id[i][k]][id[i][l]][id[i][m]]++;
}
}
}
}
for (int i = 1; i <= n; i++) {
if (c[i] >= 1) {
for (int j = 0; j < c[i]; j++) cnt1[id[i][j]] = 0;
} if (c[i] >= 2) {
for (int j = 0; j < c[i] - 1; j++) {
for (int k = j + 1; k < c[i]; k++) {
cnt2[id[i][j]][id[i][k]] = 0;
}
}
} if (c[i] >= 3) {
for (int j = 0; j < c[i] - 2; j++) {
for (int k = j + 1; k < c[i] - 1; k++) {
for (int l = k + 1; l < c[i]; l++)
cnt3[id[i][j]][id[i][k]][id[i][l]] = 0;
}
}
} if (c[i] >= 4) {
for (int j = 0; j < c[i] - 3; j++) {
for (int k = j + 1; k < c[i] - 2; k++) {
for (int l = k + 1; l < c[i] - 1; l++)
for (int m = l + 1; m < c[i]; m++)
cnt4[id[i][j]][id[i][k]][id[i][l]][id[i][m]] = 0;
}
}
}
}
cout << ans << '\n';
return 0;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
// init();
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 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 = 32;
const LL P = 998244353;
int n, k, lp[N], ls[N];
string s;
int work() {
cin >> n >> k >> s;
int lst = 0;
vector<PII> v[2]; v[0].clear(); v[1].clear();
set<int> st[2]; st[0].clear(); st[1].clear();
for (int i = 1; i < n; i++) {
if (s[i] != s[i - 1]) {
ls[lst] = i - lst;
if (i - lst >= k) v[s[lst] - 'A'].push_back({lst, i - 1});
if (i - lst == k - 1) st[s[lst] - 'A'].insert(i - 1), st[s[lst] - 'A'].insert(lst);
if (i - lst >= k + k - 1) {cout << "NO\n"; return 0;}
lst = i;
}
}
ls[lst] = n - lst;
if (n - lst >= k) v[s[lst] - 'A'].push_back({lst, n - 1});
if (n - lst == k - 1) st[s[lst] - 'A'].insert(n - 1), st[s[lst] - 'A'].insert(lst);
if (n - lst >= k + k - 1) {cout << "NO\n"; return 0;}
lst = n - 1;
for (int i = n - 2; i >= 0; i--) {
if (s[i] != s[i + 1]) {
lp[lst] = lst - i;
lst = i;
}
}
lp[lst] = lst + 1;
if (v[0].empty() && v[1].empty()) {cout << "YES\n"; return 0;}
if (v[0].size() > 1 || v[1].size() > 1) {cout << "NO\n"; return 0;}
if (v[0].size() == 1 && v[1].size() == 1) {cout << "YES\n"; return 0;}
if (!v[0].empty()) {
int p = 0;
int l = v[p][0].fr, r = v[p][0].sc;
// cout << l << ' ' << r << '\n';
for (int i = l - 1; i >= 0; i--) {
if (s[i] != s[l]) {
if (i == 0 || s[i] == s[i - 1] || (s[i] != s[i - 1] && lp[i - 1] + r - l + 1 - k + 1 < k)) {
cout << "YES\n"; return 0;
}
}
}
for (int i = r + 1; i < n; i++) {
if (s[i] != s[r]) {
if (i == n - 1 || s[i] == s[i + 1] || (s[i] != s[i + 1] && ls[i + 1] + r - l + 1 - k + 1 < k)) {
cout << "YES\n"; return 0;
}
}
}
} else {
int p = 1;
int l = v[p][0].fr, r = v[p][0].sc;
for (int i = l - 1; i >= 0; i--) {
if (s[i] != s[l]) {
if (i == 0 || s[i] == s[i - 1] || (s[i] != s[i - 1] && lp[i - 1] + r - l + 1 - k + 1 < k)) {
cout << "YES\n"; return 0;
}
}
}
for (int i = r + 1; i < n; i++) {
if (s[i] != s[r]) {
if (i == n - 1 || s[i] == s[i + 1] || (s[i] != s[i + 1] && ls[i + 1] + r - l + 1 - k + 1 < k)) {
cout << "YES\n"; return 0;
}
}
}
}
cout << "NO\n";
return 0;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
// init();
int T = 1;
cin >> T;
int Tmp = 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
#define mp make_pair
const int N = 2e5 + 10, M = 18;
const LL P = 998244353;
int n, k, mxl[M], len[N], g[N][M], d[N][M], f[1 << M];
string s;
bool check(int x) {
memset(f, 0x3f, sizeof(f));
memset(d, 0x3f, sizeof(d));
for (int i = 0; i < k; i++) d[n][i] = n + 1;
for (int i = n - 1; i >= 0; i--) {
for (int j = 0; j < k; j++) {
d[i][j] = d[i + 1][j];
if (g[i][j] >= x) d[i][j] = i;
}
}
f[0] = 0;
for (int j = 0; j < (1 << k); j++) {
if (f[j] < n) {
for (int l = 0; l < k; l++) {
if (!((j >> l) & 1)) {
f[j | (1 << l)] = min(f[j | (1 << l)], d[f[j]][l] + x);
}
}
}
}
return f[(1 << k) - 1] <= n;
}
int work() {
cin >> n >> k >> s;
int lst = 0;
for (int i = 1; i < n; i++) {
if (s[i] != s[i - 1]) {
len[lst] = i - lst;
if (s[lst] >= 'a' && s[lst] <= 'z') mxl[s[lst] - 'a'] = max(mxl[s[lst] - 'a'], i - lst);
lst = i;
}
}
len[lst] = n - lst;
if (s[lst] >= 'a' && s[lst] <= 'z') mxl[s[lst] - 'a'] = max(mxl[s[lst] - 'a'], n - lst);
for (int i = 0; i < n; i++) if (len[i] == 0) len[i] = len[i - 1] - 1;
memset(g, 0, sizeof(g));
for (int i = n - 1; i >= 0; i--) {
if (s[i] == '?') {
if (i < n - 1) for (int j = 0; j < k; j++) g[i][j] = g[i + 1][j] + 1;
else for (int j = 0; j < k; j++) g[i][j] = 1;
} else {
if (i < n - 1 && s[i + 1] == '?') g[i][s[i] - 'a'] = g[i + 1][s[i] - 'a'] + 1;
else if (i < n - 1 && s[i] == s[i + 1]) g[i][s[i] - 'a'] = g[i + 1][s[i] - 'a'] + 1;
else g[i][s[i] - 'a'] = 1;
}
}
if (n < k) {cout << 0; return 0;}
int l = 0, r = n, mid = ((l + r) >> 1);
while (l <= r) {
mid = ((l + r) >> 1);
if (check(mid)) l = mid + 1;
else r = mid - 1;
}
cout << r;
return 0;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
// init();
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 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 = 1e6 + 10, M = 4e6 + 10;
const LL P = 998244353;
int n, q; LL x[N], y[N], t[N];
struct node {
LL sum, edt, mnt;
bool fai;
};
node merge(node x, node y) {
node u = {0, 0, 0, false};
u.sum = x.sum + y.sum; u.fai = x.fai | y.fai;
if (x.edt > y.mnt) u.fai = true;
u.edt = max(x.edt + y.sum, y.edt);
u.mnt = min(x.mnt, y.mnt - x.sum);
return u;
}
struct SEG {
LL sum[M], edt[M], mnt[M]; bool fai[M];
void push_up(int u) {
int ls = u << 1, rs = u << 1 | 1;
sum[u] = sum[ls] + sum[rs]; fai[u] = fai[ls] | fai[rs];
if (edt[ls] > mnt[rs]) fai[u] = true;
edt[u] = max(edt[ls] + sum[rs], edt[rs]);
mnt[u] = min(mnt[ls], mnt[rs] - sum[ls]);
}
void build(int u, int l, int r) {
if (l == r) {
sum[u] = t[l]; edt[u] = x[l] + t[l]; mnt[u] = y[l]; fai[u] = false;
return;
}
int mid = (l + r) >> 1, ls = u << 1, rs = u << 1 | 1;
build(ls, l, mid); build(rs, mid + 1, r);
push_up(u);
}
void modify(int u, int l, int r, int p) {
if (l > p || r < p || l > r) return;
if (l == r) {
sum[u] = t[l]; edt[u] = x[l] + t[l]; mnt[u] = y[l]; fai[u] = false;
return;
}
int mid = (l + r) >> 1, ls = u << 1, rs = u << 1 | 1;
modify(ls, l, mid, p); modify(rs, mid + 1, r, p);
push_up(u);
}
node query(int u, int l, int r, int a, int b) {
if (l >= a && r <= b) return {sum[u], edt[u], mnt[u], fai[u]};
int mid = (l + r) >> 1, ls = u << 1, rs = u << 1 | 1;
if (mid >= b) return query(ls, l, mid, a, b);
if (mid < a) return query(rs, mid + 1, r, a, b);
else return merge(query(ls, l, mid, a, b), query(rs, mid + 1, r, a, b));
}
} tr;
int work() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> x[i];
for (int i = 1; i <= n; i++) cin >> y[i];
for (int i = 1; i < n; i++) cin >> t[i]; t[n] = 0;
tr.build(1, 1, n);
cin >> q;
while (q--) {
int op, a, b, c; cin >> op;
if (op == 0) {
cin >> a >> b;
node res = tr.query(1, 1, n, a, b);
if (res.fai) cout << "No\n";
else cout << "Yes\n";
} else if (op == 1) {
cin >> a >> b;
t[a] = b;
tr.modify(1, 1, n, a);
} else {
cin >> a >> b >> c;
x[a] = b; y[a] = c;
tr.modify(1, 1, n, a);
}
}
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;
}