QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#880311 | #9694. Light Drinking and Low Singing | hos_lyric | WA | 68ms | 3932kb | C++14 | 4.2kb | 2025-02-03 04:51:03 | 2025-02-03 04:51:04 |
Judging History
answer
#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
using Int = long long;
template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
#define COLOR(s) ("\x1b[" s "m")
struct Node {
int sz;
// (00)*, (01)*, (10)*, (11)*
int same;
int sum, head, tail, lz;
Node() : sz(0), sum(0), head(0), tail(0), lz(0) {}
void push(Node &l, Node &r) {
if (lz) {
l.flip();
r.flip();
lz = 0;
}
}
void pull(const Node &l, const Node &r) {
if (sz == 2) {
same = l.head | r.tail << 1;
} else {
same = (l.same == r.same) ? l.same : -1;
}
sum = l.sum + r.sum;
head = l.head;
tail = r.tail;
}
void flip() {
same ^= 3;
sum = sz - sum;
head ^= 1;
tail ^= 1;
lz ^= 1;
}
};
int segN;
vector<Node> seg;
void push(int u) { seg[u].push(seg[u << 1], seg[u << 1 | 1]); }
void pull(int u) { seg[u].pull(seg[u << 1], seg[u << 1 | 1]); }
void flip(int u, int l, int r, int a, int b) {
if (b <= l || r <= a) return;
if (a <= l && r <= b) {
seg[u].flip();
return;
}
const int uL = u << 1, uR = u << 1 | 1;
const int m = (l + r) / 2;
push(u);
flip(uL, l, m, a, b);
flip(uR, m, r, a, b);
pull(u);
}
void oper(int u, int l, int r, int a, int b, int o) {
if (b <= l || r <= a) return;
if (a <= l && r <= b) {
if (seg[u].same == 0) return;
if (seg[u].same == 3) return;
if (seg[u].same == (o | (o ^ 1) << 1)) {
flip(u, l, r, l, r);
return;
}
if (seg[u].same == ((o ^ 1) | o << 1)) {
flip(u, l, r, l + 1, r - 1);
return;
}
}
const int uL = u << 1, uR = u << 1 | 1;
const int m = (l + r) / 2;
const bool f = (a < m && m < b && seg[uL].tail == o && seg[uR].head == (o ^ 1));
push(u);
oper(uL, l, m, a, b, o);
oper(uR, m, r, a, b, o);
if (f) {
flip(uL, l, m, m - 1, m);
flip(uR, m, r, m, m + 1);
}
pull(u);
}
int get(int u, int l, int r, int a, int b) {
if (b <= l || r <= a) return 0;
if (a <= l && r <= b) return seg[u].sum;
const int uL = u << 1, uR = u << 1 | 1;
const int m = (l + r) / 2;
push(u);
const int resL = get(uL, l, m, a, b);
const int resR = get(uR, m, r, a, b);
pull(u);
return resL + resR;
}
int N, Q;
char S[2'000'010];
int main() {
for (; ~scanf("%d%d", &N, &Q); ) {
scanf("%s", S);
for (segN = 1; segN < N; segN <<= 1) {}
seg.assign(segN << 1, Node());
for (int u = segN; u < segN << 1; ++u) {
seg[u].sz = 1;
if (u - segN < N && S[u - segN] == '1') {
seg[u].sum = seg[u].head = seg[u].tail = 1;
}
}
for (int u = segN; --u; ) {
seg[u].sz = seg[u << 1].sz << 1;
pull(u);
}
for (; Q--; ) {
int O, L, R;
scanf("%d%d%d", &O, &L, &R);
--O;
--L;
if (O == 0 || O == 1) {
oper(1, 0, segN, L, R, O);
// for(int i=0;i<N;++i)cerr<<get(1,0,segN,i,i+1);cerr<<endl;
} else if (O == 2) {
const int ans = get(1, 0, segN, L, R);
printf("%d\n", ans);
} else {
assert(false);
}
}
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3840kb
input:
10 10 0011101100 2 5 9 3 2 5 1 1 10 1 1 5 3 4 6 1 2 5 2 4 9 3 5 10 3 2 7 3 1 8
output:
2 1 3 3 4
result:
ok 5 number(s): "2 1 3 3 4"
Test #2:
score: -100
Wrong Answer
time: 68ms
memory: 3932kb
input:
5000 5000 11110100011000001111101011001001000111001111100101011101110100010011000011100110001001111101001100111111001000000100001001101101001001110010101000001101110001000000001101101110101100101010010011010111011110100011001111100101101100000100111100000100001001000100100110111010010110010101101110...
output:
2466 2321 2400 2359 2430 2377 2302 2430 2426 977 2408 2356 2389 2475 2332 2466 2466 2385 2362 2284 2356 2377 2403 2432 2397 2296 2327 2353 2409 2416 2344 2385 2388 237 215 2467 2277 351 2393 2358 2398 2396 2446 2375 2439 2314 2335 2461 2432 2136 2462 2365 2305 1468 2364 2397 2391 1407 2280 2312 986 ...
result:
wrong answer 21st numbers differ - expected: '2357', found: '2356'