QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#880311#9694. Light Drinking and Low Singinghos_lyricWA 68ms3932kbC++144.2kb2025-02-03 04:51:032025-02-03 04:51:04

Judging History

This is the latest submission verdict.

  • [2025-02-03 04:51:04]
  • Judged
  • Verdict: WA
  • Time: 68ms
  • Memory: 3932kb
  • [2025-02-03 04:51:03]
  • Submitted

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;
}

详细

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'