QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#138587#5433. Absolute DifferenceKronos#WA 3ms3912kbC++207.1kb2023-08-12 00:05:342023-08-12 00:05:35

Judging History

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

  • [2023-08-12 00:05:35]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:3912kb
  • [2023-08-12 00:05:34]
  • 提交

answer

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

using i64 = long long;
using u64 = unsigned long long;

struct debug {
#define contPrint                     \
    {                                 \
        *this << "[";                 \
        int f = 0;                    \
        for (auto it : x) {           \
            *this << (f ? ", " : ""); \
            *this << it;              \
            f = 1;                    \
        }                             \
        *this << "]";                 \
        return *this;                 \
    }

    ~debug() { cerr << endl; }
    template <class c>
    debug& operator<<(c x) {
        cerr << x;
        return *this;
    }
    template <class c, class d>
    debug& operator<<(pair<c, d> x) {
        *this << "(" << x.first << ", " << x.second << ")";
        return *this;
    }
    template <class c>
    debug& operator<<(vector<c> x) contPrint;
#undef contPrint
};

#define dbg(x) "[" << #x << ": " << x << "]  "
#define Wa()                                  \
    cerr << "[LINE: " << __LINE__ << "] -> "; \
    debug() <<
#define FASTIO                        \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL);

int main() {
    int n, m;
    scanf("%d %d", &n, &m);

    vector<array<int, 3>> events;

    vector<pair<int, int>> seg_alice(n);
    for (auto& [x, y] : seg_alice) {
        scanf("%d %d", &x, &y);
        events.push_back({x, 0, 0});
        events.push_back({y, 1, 0});
    }

    vector<pair<int, int>> seg_bob(m);
    for (auto& [x, y] : seg_bob) {
        scanf("%d %d", &x, &y);
        events.push_back({x, 0, 1});
        events.push_back({y, 1, 1});
    }

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

    vector<pair<int, int>> new_seg_alice;

    {
        bool alice_running = false;

        int a_st = -1;

        for (auto [x, y, z] : events) {
            if (z == 0) {
                if (y == 0) {
                    a_st = x;
                    alice_running = true;
                } else if (y == 1) {
                    new_seg_alice.push_back({a_st, x});
                    alice_running = false;
                }
            } else {
                if (alice_running) {
                    new_seg_alice.push_back({a_st, x});
                    a_st = x;
                }
            }
        }
    }

    sort(new_seg_alice.begin(), new_seg_alice.end());
    new_seg_alice.resize(unique(new_seg_alice.begin(), new_seg_alice.end()) - new_seg_alice.begin());

    for (auto& [x, y, z] : events) {
        z ^= 1;
    }
    sort(events.begin(), events.end());

    vector<pair<int, int>> new_seg_bob;
    {
        bool alice_running = false;

        int a_st = -1;

        for (auto [x, y, z] : events) {
            Wa() dbg(x) dbg(y) dbg(z);

            if (z == 0) {
                if (y == 0) {
                    a_st = x;
                    alice_running = true;
                } else if (y == 1) {
                    new_seg_bob.push_back({a_st, x});
                    alice_running = false;
                }
            } else {
                if (alice_running) {
                    new_seg_bob.push_back({a_st, x});
                    a_st = x;
                }
            }

            Wa() dbg(a_st);
        }
    }

    sort(new_seg_bob.begin(), new_seg_bob.end());
    new_seg_bob.resize(unique(new_seg_bob.begin(), new_seg_bob.end()) - new_seg_bob.begin());


    vector <pair <int, int>> notun_seg_alice, notun_seg_bob;
    int new_n = new_seg_alice.size();
    int new_m = new_seg_bob.size();

    for (int i = 0; i < new_n; ++i) {
        if (!notun_seg_alice.empty() and notun_seg_alice.back().second == new_seg_alice[i].first) {
            notun_seg_alice.back().second = new_seg_alice[i].second;
        } else {
            notun_seg_alice.push_back(new_seg_alice[i]);
        }
    }

    for (int i = 0; i < new_m; ++i) {
        if (!notun_seg_bob.empty() and notun_seg_bob.back().second == new_seg_bob[i].first) {
            notun_seg_bob.back().second = new_seg_bob[i].second;
        } else {
            notun_seg_bob.push_back(new_seg_bob[i]);
        }
    }

    new_seg_alice = notun_seg_alice;
    new_seg_bob = notun_seg_bob;
    new_n = new_seg_alice.size();
    new_m = new_seg_bob.size();

    Wa() dbg(new_seg_alice) dbg(new_seg_bob);

    map <pair <int, int>, int> mp_alice, mp_bob;

    for (int i = 0; i < new_n; i++) {
        mp_alice[new_seg_alice[i]]++;
    }

    for (int i = 0; i < new_m; i++) {
        mp_bob[new_seg_bob[i]]++;
    }

    long double tot_n = 0, tot_m = 0;

    vector <long double> sq_alice(new_n + 1), sq_bob(new_m + 1);
    vector <long double> dif_alice(new_n + 1), dif_bob(new_m + 1);
    vector <long double> eq_sum_alice(new_n + 1), eq_sum_bob(new_m + 1);

    for (int i = 0; i < new_n; ++i) {
        auto [x, y] = new_seg_alice[i];
        sq_alice[i] = y * y - x * x;
        dif_alice[i] = y - x;
        if (x == y) eq_sum_alice[i] = 1;
        tot_n += y - x;
    }

    for (int i = 0; i < new_m; ++i) {
        auto [x, y] = new_seg_bob[i];
        sq_bob[i] = y * y - x * x;
        dif_bob[i] = y - x;
        if (x == y) eq_sum_bob[i] = 1;
        tot_m += y - x;
    }

    for (int i = 1; i < new_n + 1; ++i) {
        sq_alice[i] += sq_alice[i - 1];
        dif_alice[i] += dif_alice[i - 1];
        eq_sum_alice[i] += eq_sum_alice[i - 1];
    }

    for (int i = 1; i < new_m + 1; ++i) {
        sq_bob[i] += sq_bob[i - 1];
        dif_bob[i] += dif_bob[i - 1];
        eq_sum_bob[i] += eq_sum_bob[i - 1];
    }

    long double sum = 0;
    for (int i = 0; i < new_n; ++i) {
        auto [a, b] = new_seg_alice[i];
        auto id = lower_bound(new_seg_bob.begin(), new_seg_bob.end(), new_seg_alice[i]) - new_seg_bob.begin();
        
        long double sq_g = (sq_bob[new_m] - (id ? sq_bob[id - 1] : 0)) / 2.0;
        long double dif_g = (dif_bob[new_m] - (id ? dif_bob[id - 1] : 0)) / 2.0;

        sum += sq_g * (b - a) - dif_g * (b + a);
        
        long double sq_l = -(id ? sq_bob[id - 1] : 0) / 2.0;
        long double dif_l = -(id ? dif_bob[id - 1] : 0) / 2.0;

        sum += sq_l * (b - a) - dif_l * (b + a);

        Wa() dbg(sq_g) dbg(sq_l) dbg(dif_g) dbg(dif_l); 

        if (mp_alice[new_seg_alice[i]] and mp_bob[new_seg_alice[i]]) {
            sum += 1.0 * (b - a) * (b - a) * (b - a) / 3.0;
        }

        long double eq_sum_g = eq_sum_bob[new_m] - (id ? eq_sum_bob[id - 1] : 0);
        long double llen = new_m - id;

        if (eq_sum_g) sum += eq_sum_g * (b - a) - (b * b - a * a) / 2.0 * llen;
        
        long double eq_sum_l = (id ? eq_sum_bob[id - 1] : 0);
        llen = id;

        if (eq_sum_l) sum += (b * b - a * a) / 2.0 * llen - eq_sum_l * (b - a);

        Wa() dbg(b - a) dbg(b * b - a * a) dbg(eq_sum_g) dbg(eq_sum_l);
    }

    Wa() dbg(sum);

    if (tot_n) sum /= tot_n;
    else sum /= new_n;
    if (tot_m) sum /= tot_m;
    else sum /= new_m;

    printf("%.10Lf\n", sum);
}

详细

Test #1:

score: 100
Accepted
time: 3ms
memory: 3732kb

input:

1 1
0 1
0 1

output:

0.3333333333

result:

ok found '0.333333333', expected '0.333333333', error '0.000000000'

Test #2:

score: 0
Accepted
time: 3ms
memory: 3808kb

input:

1 1
0 1
1 1

output:

0.5000000000

result:

ok found '0.500000000', expected '0.500000000', error '0.000000000'

Test #3:

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

input:

1 1
-1000000000 1000000000
-1000000000 1000000000

output:

666666666.6666666297

result:

ok found '666666666.666666627', expected '666666666.666666627', error '0.000000000'

Test #4:

score: -100
Wrong Answer
time: 3ms
memory: 3912kb

input:

1 1
-1000000000 0
0 1000000000

output:

-0.2433093120

result:

wrong answer 1st numbers differ - expected: '1000000000.0000000', found: '-0.2433093', error = '1.0000000'