QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#551718#2346. Miniature GolfRngBased#AC ✓5233ms1576584kbC++203.5kb2024-09-07 17:54:052024-09-07 17:54:08

Judging History

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

  • [2024-09-07 17:54:08]
  • 评测
  • 测评结果:AC
  • 用时:5233ms
  • 内存:1576584kb
  • [2024-09-07 17:54:05]
  • 提交

answer

#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
#define ll long long
#define int long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pdd pair<double, double>
#define F first
#define S second
#define all(x) x.begin(), x.end()
using namespace std;
int n, m, arr[505][55], ans[505], order[505], pos[505];
ll A[505], B[505];
vector<int> ord, diff;
vector<pair<ll, pii> > point;
ll last_val = -1;
ll solve(ll a1, ll b1, ll a2, ll b2){
    if (a1 == a2) return -1;
    return (b2 - b1) / (a1 - a2);
}
void intersect(int a, int b){
    vector<pii> val;
    int pa = m, pb = m, suma = 0, sumb = 0;
    for (int h = 1; h <= m; h++)
        val.emplace_back(arr[a][h], 0),
        val.emplace_back(arr[b][h], 1);
    sort(all(val));
    for (int i = 1; i < val.size(); i++){
        ll l = val[i - 1].F, r = val[i].F;
        if (val[i - 1].S == 0)
            suma += val[i - 1].F, pa--;
        else sumb += val[i - 1].F, pb--;
        ll meet = solve(pa, suma, pb, sumb);
        if (meet >= l && meet <= r){
            point.emplace_back(meet - 1, pii(a, b));
            point.emplace_back(meet, pii(a, b));
            point.emplace_back(meet + 1, pii(a, b));
        }
    }
}
int find(int i, ll p){
    int l = 0, r = n;
    // cerr << "find " << i << " : \n";
    while (l < r){
        int mid = (l + r) >> 1;
        // cerr << ord[mid] << " " << A[ord[mid]] * p + B[ord[mid]] << " " << A[i] * p + B[i] << '\n';
        if (A[ord[mid]] * p + B[ord[mid]] <= A[i] * p + B[i])
            l = mid + 1;
        else r = mid;
    }
    return l;
}
void solve(ll p){
    if (diff.empty())
        return;
    vector<pll> val;
    vector<int> have_pos;
    sort(all(diff)), diff.resize(unique(all(diff)) - diff.begin());
    for (auto i : diff){
        val.emplace_back(A[i] * p + B[i], i);
        have_pos.emplace_back(pos[i]);
    }
    sort(all(val)), sort(all(have_pos));
    for (int i = 0; i < val.size(); i++){
        ord[have_pos[i]] = val[i].S;
        pos[val[i].S] = have_pos[i];
    }
    // for (int i = 1; i <= n; i++)
    //     cerr << ord[i - 1] << " \n"[i == n];
    for (auto i : diff){
        // cerr << "count " << p << " " << i << " : \n" << find(i, p) << '\n';
        ans[i] = min(ans[i], find(i, p));
    }
    // for (int i = 1; i <= n; i++)
    //     cerr << pos[i] << " \n"[i == n];
    diff.clear();
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= m; j++)
            cin >> arr[i][j];
        sort(arr[i] + 1, arr[i] + 1 + m);
    }
    for (int i = 1; i <= n; i++){
        for (int j = i + 1; j <= n; j++)
            intersect(i, j);
    }
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            point.emplace_back(arr[i][j], pii(-i, -i));
    sort(all(point));
    for (int i = 1; i <= n; i++)
        ord.emplace_back(i), pos[i] = i - 1;
    fill(ans, ans + n + 1, n);
    fill(A, A + n + 1, m);
    for (auto [p, type] : point){
        if (p != last_val)
            solve(p);
        if (type.F != type.S){
            diff.emplace_back(type.F);
            diff.emplace_back(type.S);
        }
        else 
            A[-type.F]--, B[-type.F] += p;
        last_val = p;
    }
    solve(last_val);
    for (int i = 1; i <= n; i++)
        cout << ans[i] << "\n";
}
/*
6 4
3 1 2 2 
4 3 2 2
6 6 3 2
7 3 4 3
3 4 2 4
2 3 3 5
*/

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3828kb

Test #2:

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

Test #3:

score: 0
Accepted
time: 0ms
memory: 3588kb

Test #4:

score: 0
Accepted
time: 0ms
memory: 3796kb

Test #5:

score: 0
Accepted
time: 0ms
memory: 3576kb

Test #6:

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

Test #7:

score: 0
Accepted
time: 0ms
memory: 3688kb

Test #8:

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

Test #9:

score: 0
Accepted
time: 4ms
memory: 4156kb

Test #10:

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

Test #11:

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

Test #12:

score: 0
Accepted
time: 5ms
memory: 5672kb

Test #13:

score: 0
Accepted
time: 0ms
memory: 3684kb

Test #14:

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

Test #15:

score: 0
Accepted
time: 7ms
memory: 5484kb

Test #16:

score: 0
Accepted
time: 4199ms
memory: 1576584kb

Test #17:

score: 0
Accepted
time: 5233ms
memory: 789876kb

Test #18:

score: 0
Accepted
time: 5164ms
memory: 790120kb

Test #19:

score: 0
Accepted
time: 4172ms
memory: 398032kb

Test #20:

score: 0
Accepted
time: 3203ms
memory: 790612kb

Test #21:

score: 0
Accepted
time: 3152ms
memory: 790684kb

Test #22:

score: 0
Accepted
time: 3217ms
memory: 790424kb

Test #23:

score: 0
Accepted
time: 354ms
memory: 28160kb

Test #24:

score: 0
Accepted
time: 359ms
memory: 29768kb

Test #25:

score: 0
Accepted
time: 364ms
memory: 29772kb

Test #26:

score: 0
Accepted
time: 353ms
memory: 28304kb

Test #27:

score: 0
Accepted
time: 353ms
memory: 29728kb