QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#385719#5109. Spider WalkSolitaryDreamWA 189ms11432kbC++174.0kb2024-04-11 00:43:012024-04-11 00:43:02

Judging History

你现在查看的是最新测评结果

  • [2024-04-11 00:43:02]
  • 评测
  • 测评结果:WA
  • 用时:189ms
  • 内存:11432kb
  • [2024-04-11 00:43:01]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int N = 8e5 + 10;
int n, m, s;
namespace Seg {
    int L[N], R[N], tg[N];
    inline void SetTag(int v, int z) {
        tg[v] += z;
        L[v] += z;
        R[v] += z;
    }
    inline void PushDown(int v) {
        if (tg[v]) {
            SetTag(v << 1, tg[v]);
            SetTag(v << 1 | 1, tg[v]);
            tg[v] = 0;
        }
    }
    inline void PushUp(int v) {
        L[v] = L[v << 1];
        R[v] = R[v << 1 | 1];
    }
    inline void Init(int v = 1, int l = 0, int r = n - 1) {
        if (l == r) {
            int d1 = (s - l + n) % n;
            int d2 = (l - s + n) % n;
            L[v] = R[v] = min(d1, d2);
            return;
        }
        int mid = (l + r) >> 1;
        Init(v << 1, l, mid); Init(v << 1 | 1, mid + 1, r);
        PushUp(v);
    }
    inline int Ask(int x, int v = 1, int l = 0, int r = n - 1) {
        if (l == r) return L[v];
        int mid = (l + r) >> 1;
        PushDown(v);
        return x <= mid ? Ask(x, v << 1, l, mid) : Ask(x, v << 1 | 1, mid + 1, r);
    }
    inline void Set(int x, int z, int v = 1, int l = 0, int r = n - 1) {
        if (l == r) { L[v] = R[v] = z; return; }
        int mid = (l + r) >> 1;
        PushDown(v);
        if (x <= mid) Set(x, z, v << 1, l, mid); else Set(x, z, v << 1 | 1, mid + 1, r);
        PushUp(v);
    }
    inline void Add(int x, int y, int z, int v, int l, int r) {
        if (x > r || y < l) return;
        if (x <= l && r <= y) { SetTag(v, z); return; }
        int mid = (l + r) >> 1;
        PushDown(v);
        Add(x, y, z, v << 1, l, mid); Add(x, y, z, v << 1 | 1, mid + 1, r);
        PushUp(v);
    }
    inline void UpdateInc(int x, int z, int v = 1, int l = 0, int r = n - 1) {  // x..n-1
        if (l == r) { 
            if (l >= x) L[v] = R[v] = min(L[v], z + (l - x));
            return;
        }
        int mid = (l + r) >> 1;
        PushDown(v);
        if (mid < x) UpdateInc(x, z, v << 1 | 1, mid + 1, r);
        else {
            int vl = L[v << 1 | 1];
            if (vl <= z + (mid + 1 - x)) UpdateInc(x, z, v << 1, l, mid);
            else { Add(x, n - 1, -1, v << 1, l, mid); UpdateInc(x, z, v << 1 | 1, mid + 1, r); }
        }
        PushUp(v);
    }
   inline void UpdateDec(int x, int z, int v = 1, int l = 0, int r = n - 1) {  // 0..x
        if (x < l || R[v] <= z + (r - x)) return;
        if (r <= x && R[v] == z + (r - x) + 1) { SetTag(v, z); return; }
        // if (l == r) { 
        //     if (l <= x) L[v] = R[v] = min(L[v], z + (x - l));
        //     return;
        // }
        int mid = (l + r) >> 1;
        PushDown(v);
        UpdateDec(x, z, v << 1, l, mid);
        UpdateDec(x, z, v << 1 | 1, mid + 1, r);
        PushUp(v);
    }
    inline void PrintAns(int v = 1, int l = 0, int r = n - 1) {
        if (l == r) { cout << L[v] << '\n'; return; }
        int mid = (l + r) >> 1;
        PushDown(v);
        PrintAns(v << 1, l, mid); PrintAns(v << 1 | 1, mid + 1, r);
    }
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m >> s;
    --s;
    vector<pii> ops;
    for (int i = 1, x, y; i <= m; ++i) {
        cin >> x >> y;
        --y;
        ops.push_back({x, y});
    }
    sort(ops.begin(), ops.end(), greater<pii>());
    Seg::Init();
    for (auto [_x, pb] : ops) {
        // Seg::PrintAns();
        // cout << endl;
        int pa = (pb + n - 1) % n, pc = (pb + 1) % n, pd = (pc + 1) % n;
        int vb = Seg::Ask(pb), vc = Seg::Ask(pc);
        if (vb == vc) {
            // pass
        } else if (vb > vc) {
            Seg::Set(pc, min(vb, Seg::Ask(pd) + 1));
            // a[pb] = vc;
            Seg::UpdateDec(pb, vc);
            Seg::UpdateDec(n - 1, vc + pb + 1);
        } else {
            Seg::Set(pb, min(vc, Seg::Ask(pa) + 1));
            // a[pc] = vb;
            Seg::UpdateInc(pc, vb);
            Seg::UpdateInc(0, vb + n - pc);
        }
    }
    Seg::PrintAns();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 189ms
memory: 11432kb

input:

200000 500000 116205
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
24 25
25 26
26 27
27 28
28 29
29 30
30 31
31 32
32 33
33 34
34 35
35 36
36 37
37 38
38 39
39 40
40 41
41 42
42 43
43 44
44 45
45 46
46 47
47 48
48 49
49 50
50...

output:

83794
83795
83795
83796
83797
83798
83799
83800
83801
83802
83803
83804
83805
83806
83807
83808
83809
83810
83811
83812
83813
83814
83815
83816
83817
83818
83819
83820
83821
83822
83823
83824
83825
83826
83827
83828
83829
83830
83831
83832
83833
83834
83835
83836
83837
83838
83839
83840
83841
83842
...

result:

wrong answer 1st lines differ - expected: '2', found: '83794'