QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#551718 | #2346. Miniature Golf | RngBased# | AC ✓ | 5233ms | 1576584kb | C++20 | 3.5kb | 2024-09-07 17:54:05 | 2024-09-07 17:54:08 |
Judging History
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