QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#109911#360. Cultivationbashkort0 2ms3568kbC++204.7kb2023-05-30 22:57:102023-05-30 22:57:13

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-30 22:57:13]
  • 评测
  • 测评结果:0
  • 用时:2ms
  • 内存:3568kb
  • [2023-05-30 22:57:10]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

constexpr int inf = 1e9 + 7;

array<int, 3> operator+(const array<int, 3> &a, const array<int, 3> &b) {
    return {max(a[0], b[0]), max(a[1], b[1]), max(a[2], b[2])};
}

constexpr array<int, 3> neut = {inf, inf, 2 * inf};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int R, C, n;
    cin >> R >> C >> n;

    vector<pair<int, int>> pt(n);
    vector<int> x(n), y(n);

    for (int i = 0; i < n; ++i) {
        cin >> x[i] >> y[i];
        --x[i], --y[i];
        pt[i] = {x[i], y[i]};
    }

    sort(pt.begin(), pt.end());

    for (int i = 0; i < n; ++i) {
        x[i] = pt[i].first;
        y[i] = pt[i].second;
    }

    vector mx(n + 1, vector<array<int, 3>>(n + 1, neut));

    for (int i = 0; i < n; ++i) {
        multiset<int> sy, diff;
        sy.insert(-1), sy.insert(C);
        diff.insert(C);

        auto ins = [&](int i) {
            if (i == n) {
                return;
            }
            auto it = sy.lower_bound(y[i]);
            int nxt = *it, prv = *prev(it);
            diff.extract(nxt - prv - 1);
            diff.insert(y[i] - prv - 1);
            diff.insert(nxt - y[i] - 1);
            sy.insert(y[i]);
        };

        for (int j = i; j < n; ++j) {
            ins(j);
            int fi = *next(sy.begin());
            int la = *next(sy.rbegin());
            mx[i][j] = {fi, C - la - 1, *diff.rbegin()};
        }
    }

    int ans = R + C;

    auto upd = [&](const array<int, 3> &a, int s) {
        ans = min<ll>(ans, max<ll>(a[0] + a[1], a[2]) + s);
    };

    auto check = [&](int s) -> array<int, 3> {
        if (s >= R) {
            return {};
        }

        array<int, 3> now{};

        auto relax = [&](int i, int j) {
            if (i >= j) {
                now = neut;
            } else {
                now = now + mx[i][j - 1];
            }
        };

        if (x[0] > s || x.back() + s + 1 < R) {
            return neut;
        }

        for (int i = 0, j = 0; i < n; ++i) {
            while (j < n && x[j] - x[i] - 1 <= s) {
                j += 1;
            }
            relax(i, j);
            if (x[i] + s + 1 >= R) {
                break;
            }
            if (j == n || x[j] != x[i] + s + 1) {
                relax(i + 1, j);
            }
        }

        return now;
    };

    auto checku = [&](int u) -> array<int, 3> {
        if (x[0] > u) {
            return neut;
        }

        int j = 0;

        while (j < n && x[j] <= u) {
            j += 1;
        }

        return mx[0][j - 1];
    };

    auto checkd = [&](int d) -> array<int, 3> {
        if (x.back() + d + 1 < R) {
            return neut;
        }

        int j = n;

        while (j > 0 && x[j - 1] + d + 1 >= R) {
            j -= 1;
        }

        return mx[j][n - 1];
    };

    vector<int> us, ds, sums;

    for (int i = 0; i < n; ++i) {
        us.push_back(x[i]);
        ds.push_back(R - x[i] - 1);
        for (int j = 0; j < n; ++j) {
            if (x[j] > x[i]) {
                sums.push_back(x[j] - x[i] - 1);
            }
        }
    }

    us.push_back(0);
    ds.push_back(0);
    sums.push_back(0);
    sort(us.begin(), us.end());
    sort(ds.begin(), ds.end());
    sort(sums.begin(), sums.end());
    us.resize(unique(us.begin(), us.end()) - us.begin());
    ds.resize(unique(ds.begin(), ds.end()) - ds.begin());
    sums.resize(unique(sums.begin(), sums.end()) - sums.begin());

    vector<array<int, 3>> cu, cd, cs;

    for (int u : us) {
        cu.push_back(checku(u));
    }
    for (int d : ds) {
        cd.push_back(checkd(d));
    }
    for (int s : sums) {
        cs.push_back(check(s));
    }

    for (int i = 0; i < size(cu); ++i) {
        for (int j = 0; j < size(cd); ++j) {
            int s = us[i] + ds[j];
            int is = upper_bound(sums.begin(), sums.end(), s) - sums.begin() - 1;
            upd(cu[i] + cd[j] + cs[is], us[i] + ds[j]);
        }
    }


    for (int i = 0; i < size(cs); ++i) {
        for (int j = 0; j < size(cd); ++j) {
            if (sums[i] >= ds[j]) {
                int u = sums[i] - ds[j];
                int iu = upper_bound(us.begin(), us.end(), u) - us.begin() - 1;
                upd(cs[i] + cd[j] + cu[iu], sums[i]);
            }
        }
        for (int j = 0; j < size(cu); ++j) {
            if (sums[i] >= us[j]) {
                int d = sums[i] - us[j];
                int id = upper_bound(ds.begin(), ds.end(), d) - ds.begin() - 1;
                upd(cs[i] + cu[j] + cd[id], sums[i]);
            }
        }
    }

    cout << ans << '\n';

    return 0;
}

詳細信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 3440kb

input:

2 4
2
1 1
1 4

output:

6

result:

wrong answer 1st lines differ - expected: '3', found: '6'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 0
Wrong Answer

Test #45:

score: 30
Accepted
time: 2ms
memory: 3460kb

input:

1000000000 1000000000
17
822413671 70423910
260075513 431043546
300945721 793553248
142848049 163787897
392462410 831950868
699005697 111397300
444396260 130450496
642691616 595456084
467968916 463598810
159764248 611476406
929313754 539645102
365153650 964108073
906780716 373514044
970118116 655138...

output:

852626202

result:

ok single line: '852626202'

Test #46:

score: 0
Accepted
time: 2ms
memory: 3500kb

input:

1000000000 1000000000
24
382358372 812500277
617637090 687506454
441176760 562497727
382346048 687504690
205880053 312504652
794110577 62497634
264714161 937490675
970587944 812502893
617647581 62504110
852944701 812498007
88227293 187492617
558814156 687495577
29403236 812494493
911761865 187491781...

output:

904419459

result:

ok single line: '904419459'

Test #47:

score: 0
Accepted
time: 2ms
memory: 3500kb

input:

1000000000 1000000000
25
59999964 299999989
740000035 100000111
139999972 499999797
740000159 899999809
940000104 899999905
459999870 299999853
139999925 899999750
260000183 300000150
260000200 699999915
940000072 99999821
340000223 900000130
739999776 499999813
59999984 700000029
539999767 90000023...

output:

480000793

result:

ok single line: '480000793'

Test #48:

score: 0
Accepted
time: 1ms
memory: 3568kb

input:

1000000000 1000000000
25
496770868 499466029
150245306 140351260
443861207 442170127
915815913 907024280
592352731 580300173
614771420 602707761
545759771 564678204
790963611 795646738
466306333 474998682
700037062 710428701
326403486 341417980
13108429 18468915
296795338 282907012
207909366 2192548...

output:

1967193239

result:

ok single line: '1967193239'

Test #49:

score: 0
Accepted
time: 2ms
memory: 3524kb

input:

1000000000 1000000000
25
508699723 917649746
972134563 24654272
591574312 768222747
342111766 678842208
280650655 335101574
112108587 538128714
232733100 741988808
569340416 313541403
333183415 646381341
348331220 239049882
321253252 46884019
458715217 456559440
11396102 588839952
212356188 55359081...

output:

967430445

result:

ok single line: '967430445'

Test #50:

score: 0
Accepted
time: 2ms
memory: 3512kb

input:

1000000000 1000000000
25
87500002 928571428
712500002 71428571
212500002 71428570
837500001 71428573
912499999 214285715
287500002 785714285
37500003 785714285
962500002 357142856
787500000 785714288
787500003 500000003
462500002 71428570
462500001 357142859
37499999 500000000
462500002 642857144
37...

output:

660714282

result:

ok single line: '660714282'

Test #51:

score: -30
Wrong Answer
time: 1ms
memory: 3456kb

input:

1000000000 1000000000
25
499999999 565789472
499999990 250000002
499999996 749999995
499999999 144736850
499999993 513157893
499999992 644736853
500000010 13157889
499999998 118421056
499999993 197368414
499999990 592105269
499999994 486842107
500000005 276315783
499999994 539473685
499999990 618421...

output:

2000000000

result:

wrong answer 1st lines differ - expected: '1131578975', found: '2000000000'

Subtask #5:

score: 0
Skipped

Dependency #4:

0%

Subtask #6:

score: 0
Skipped

Dependency #1:

0%