QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#105457#4236. Triangular Logsmarsxiang5902WA 4ms17528kbC++173.3kb2023-05-14 07:05:122023-05-14 07:05:15

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-14 07:05:15]
  • 评测
  • 测评结果:WA
  • 用时:4ms
  • 内存:17528kb
  • [2023-05-14 07:05:12]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

const int MN = 1e5+5, MK = 60, TS = 1<<17;
using st = vector<int>;

int cmbTmp[MK*2];
void comb(st &s1, const st &s2) {
    merge(s1.begin(), s1.end(), s2.begin(), s2.end(), cmbTmp, greater<int>());
    s1 = st(cmbTmp, cmbTmp+min(MK, (int)(s1.size()+s2.size())));
}

int N, Q, cmp[2][MN], pts[2][MN], n[2], hs[MN], psa[MN]; st seg[TS<<1], ans[MN];
vector<pair<int,int>> upds[MN]; vector<tuple<int,int,int>> qeps[MN];

inline int lb(int z, int x) { return lower_bound(cmp[z], cmp[z]+n[z], x) - cmp[z]; }
inline bool noUpds(int l, int r) { !(psa[l]-psa[r+1]); }
void upd(int y, int h) {
    st ns = st{h};
    for (comb(seg[y|=TS], ns); y>>=1; )
        comb(seg[y], ns);
}
void que(int l, int r, int qn) {
    for (l|=TS, ++r|=TS; l < r; l>>=1, r>>=1) {
        if (l&1) comb(ans[qn], seg[l++]);
        if (r&1) comb(ans[qn], seg[--r]);
    }
}
void clr(int y) {
    for (seg[y|=TS].clear(); y>>=1; )
        seg[y].clear();
}

void cdq(int l, int r, vector<tuple<int,int,int,int,int>> qs) {
    if (l > r || qs.empty() || noUpds(l, r)) return;
    int m = l+r >> 1;
    vector<tuple<int,int,int,int,int>> ql, qr;
    for (auto [x0, x1, y0, y1, qn]: qs) {
        if (x0 <= m+1 && x1 >= m) {
            if (x0 <= m) qeps[x0].emplace_back(y0, y1, qn);
            if (x1 > m) qeps[x1].emplace_back(y0, y1, qn);
        } else (x1 <= m ? ql : qr).emplace_back(x0, x1, y0, y1, qn);
    }

    for (int i = m; i >= l; i--) {
        for (auto [y, h]: upds[i])
            upd(y, h);
        for (auto [l, r, qn]: qeps[i])
            que(l, r, qn);
    }
    for (int i = m; i >= l; i--)
        for (auto [y, h]: upds[i])
            clr(y);
    for (int i = m+1; i <= r; i++) {
        for (auto [y, h]: upds[i])
            upd(y, h);
        for (auto [l, r, qn]: qeps[i])
            que(l, r, qn);
    }
    for (int i = m+1; i <= r; i++)
        for (auto [y, h]: upds[i])
            clr(y);

    for (auto [x0, x1, y0, y1, qn]: qs) {
        if (x0 <= m+1 && x1 >= m) {
            if (x0 <= m) qeps[x0].clear();
            if (x1 > m) qeps[x1].clear();
        }
    }
    cdq(l, m, ql); cdq(m+1, r, qr);
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);

    cin >> N >> Q;
    for (int i = 0; i < N; i++)
        cin >> pts[0][i] >> pts[1][i] >> hs[i];
    for (int z: {0,1}) {
        memcpy(cmp[z], pts[z], sizeof pts[0]);
        sort(cmp[z], cmp[z]+N);
        n[z] = unique(cmp[z], cmp[z]+N) - cmp[z];
        for (int i = 0; i < N; i++)
            pts[z][i] = lb(z, pts[z][i]);
    }
    for (int i = 0; i < N; i++) {
        upds[pts[0][i]].emplace_back(pts[1][i], hs[i]);
        ++psa[pts[0][i]];
    }
    for (int i = n[0]; --i; )
        psa[i-1] += psa[i];
    vector<tuple<int,int,int,int,int>> qs;
    for (int q = 0, x0, y0, x1, y1; q < Q; q++) {
        cin >> x0 >> y0 >> x1 >> y1;
        x0 = lb(0, x0);
        y0 = lb(1, y0);
        x1 = lb(0, x1+1)-1;
        y1 = lb(1, y1+1)-1;
        if (x0 <= x1 && y0 <= y1) qs.emplace_back(x0, x1, y0, y1, q);
    }
    cdq(0, n[0]-1, qs);
    for (int q = 0; q < Q; q++) {
        st &s = ans[q];
        bool b = 0;
        for (int i = 0; i+2 < s.size(); i++)
            b |= s[i+1]+s[i+2] > s[i];
        printf("%d\n", b);
    }

    return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 4ms
memory: 17528kb

input:

9 5
1 3 3
2 3 1
3 3 4
1 2 1
2 2 5
3 2 9
1 1 2
2 1 6
3 1 5
1 1 1 2
1 1 2 2
1 1 1 3
1 2 3 2
1 1 3 3

output:

0
0
0
0
0

result:

wrong answer 2nd lines differ - expected: '1', found: '0'