QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#379860 | #8576. Symphony in c++ major | ucup-team027# | TL | 1ms | 3828kb | C++23 | 2.5kb | 2024-04-06 19:35:02 | 2024-04-06 19:35:05 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
template <typename T> using min_heap = priority_queue<T, vector<T>, greater<T>>;
vector<string> nt = {"do", "re", "mi", "fa", "so", "la", "ti"};
struct node{
vector<vector<int>> dp;
node() {
dp.resize(8, vector<int>(8, -1000000));
}
};
const node unit;
node make_node(char ch) {
node nd;
nd.dp[7][7] = 0;
for (int i = 0; i < 7; i++) {
if (ch == nt[i][1]) nd.dp[i][7] = 0;
if (ch == nt[i][0]) nd.dp[7][i] = 0;
}
return nd;
}
node merge(node a, node b) {
node ans;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
ans.dp[i][j] = max(ans.dp[i][j], a.dp[i][j]);
ans.dp[i][j] = max(ans.dp[i][j], b.dp[i][j]);
}
}
for (int k = 0; k < 8; k++) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
ans.dp[i][j] = max(ans.dp[i][j], a.dp[i][k] + b.dp[k][j] + 2*(k < 7));
}
}
}
return ans;
}
void print_node(node nd) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
cout << nd.dp[i][j] << ' ';
}
cout << '\n';
}
}
struct Tree {
typedef node T;
T f(T a, T b) { return merge(a, b); } // (any associative fn)
vector<T> s; int n;
Tree(int n = 0, T def = unit) : s(2*n, def), n(n) {}
void update(int pos, char ch) {
node val = make_node(ch);
//cout << ch << '\n'; print_node(val);
for (s[pos += n] = val; pos /= 2;)
s[pos] = f(s[pos * 2], s[pos * 2 + 1]);
}
T query(int b, int e) { // query [b, e)
T ra = unit, rb = unit;
for (b += n, e += n; b < e; b /= 2, e /= 2) {
if (b % 2) ra = f(ra, s[b++]);
if (e % 2) rb = f(s[--e], rb);
}
return f(ra, rb);
}
};
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
int n, q; cin >> n >> q;
Tree tr(n);
for (int i = 0; i < n; i++) {
char c; cin >> c;
tr.update(i, c);
}
while (q--) {
char c; cin >> c;
if (c == '?') {
int l, r; cin >> l >> r; l--;
node nd = tr.query(l, r);
int ans = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
ans = max(ans, nd.dp[i][j]);
}
}
cout << (r-l)-ans << '\n';
} else {
int l, r; cin >> l >> r; l--;
for (int i = l; i < r; i++) {
char c; cin >> c;
tr.update(i, c);
}
}
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3828kb
input:
8 10 eldorado ? 1 3 ? 1 8 # 6 7 it ? 1 8 # 3 3 t ? 1 8 # 1 8 streamer ? 1 8 # 1 8 symphony ? 1 8
output:
3 4 6 6 6 6
result:
ok 6 numbers
Test #2:
score: -100
Time Limit Exceeded
input:
500000 300000 rfsraltzititrofomloldlaefikdemaddaafmimiioiuaueiaedifacmxamttiiitaaltiiireexeafsaaraedosotlaioootaiosizlifiioadhnxiofsasaflleaiisstaotdlliulilxatrpdaraaraaoiaeoooiumwuumarlifesroloistedoaaieolisaoatamsredorrfiifaaidfeassfioaiasmstomasallsftsrfaiiirteomaeiirefldmlaoaofrxlaeuilioirafotoa...