QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#127491 | #6632. Minimize Median | oreoioiwy | TL | 36ms | 18864kb | C++17 | 4.8kb | 2023-07-19 18:47:41 | 2023-07-19 18:47:42 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
// #define tpyeinput int
// inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;}
// inline void read(tpyeinput &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();}
template<typename T>
void read(T &x) {
int f = 1;
x = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + (ch ^ 48);
ch = getchar();
}
x *= f;
}
const int N = 1e6+10;
int n, m, K;
int a[N];
// int f[N][30];
int hou[N];
ll M[N],MM;
bool prime[N];
vector<int> primes, fac;
// void ST_pre() {
// for(int i=1; i<=m; i++) f[i][0] = M[i];
// int t = log(m)/ log(2) + 1;
// for(int j=1; j<t; j++) {
// for(int i=1; i<=m-(1<<j)+1; i++) {
// f[i][j] = min(f[i][j-1], f[i+(1<<(j-1))][j-1]);
// }
// }
// }
// int query(int l, int r) {
// int k = log(r-l+1)/log(2);
// return min(f[l][k], f[r-(1<<k)+1][k]);
// }
void ST_pre()
{
hou[m] = M[m];
for(int i = m-1;i > 0; i--)
{
hou[i] = min(hou[i+1], M[i]);
}
}
int query(int l, int r)
{
return hou[l];
}
int ksm(int x,int y)
{
int res = 1;
while(y)
{
if(y & 1)
{
res *= x;
}
x *= x;
y >>= 1;
}
return res;
}
void preprim()
{
for(int i = 2; i < N; i++)
{
if(!prime[i])
{
primes.push_back(i);
for(int j = i + i; j < N; j += i)
{
prime[j] = true;
}
}else
{
fac.push_back(i);
}
}
}
void precost()
{
for(int i : fac)
{
if(i > m) break;
ll mn = M[i];
vector<pair<int,int>> prims;
int ii = i;
double sqrti = sqrt(ii);
for(int j : primes)
{
if(j > sqrti) break;
if(ii % j == 0)
{
prims.push_back({j,0});
while(ii % j == 0)
{
prims.back().second++;
ii /= j;
}
}
}
if(ii > 1)
{
prims.push_back({ii,1});
}
if(prims.size() == 1)
{
// auto [x,y] = prims[0];
int x = prims[0].first, y = prims[0].second;
for(int j = 1; j <= (y >> 1); j++)
{
mn = min(mn, M[ksm(x,j)] + M[ksm(x,y-j)]);
}
}else
{
int sum = 0;
for(auto [x,y] : prims)
{
sum += M[ksm(x,y)];
}
mn = min(mn, sum);
}
M[i] = mn;
}
for(int i=2; i<=m;i++)
{
for(int j=(m+1)/i - 1; j <= m; j++)
{
if(i * j <= m) continue;
MM = min(MM, M[i] + M[j]);
}
}
}
void pre_M() {
for(int i=1; i<=m; i++) {
for(int j=1; j<i; j++) {
if(i % j == 0) {
M[i] = min(M[i], M[j] + M[i/j]);
}
}
}
for(int i=2; i<=m;i++)
{
for(int j=(m+1)/i - 1; j <= m; j++)
{
if(i * j <= m) continue;
MM = min(MM, M[i] + M[j]);
}
}
}
ll check(int mid) {
if(mid == a[n/2+1]) return 0;
if(mid > a[n/2+1]) return -1;
ll cost = 0;
int l = lower_bound(a+1, a+1+n, mid+1) - a;
// int ll = lower_bound(a+1, a+1+n, mid) - a;
int cnt = l-1;
// if(cntt > n/2) return -1;
while(cnt < n/2+1) {
int tmp = mid ? (a[l]-1)/mid+1 : a[l]+1;
if(tmp > m)
{
cost += MM;
cnt++; l++;
continue;
}
while(a[l]/tmp > mid) tmp++;
while(a[l]/(tmp-1) <= mid) tmp--;
cost += min(MM,query(tmp, m));
cnt++; l++;
}
return cost;
}
void solve() {
read(n); read(m); read(K);
MM = 1e18;
for(int i=1; i<=n; i++) read(a[i]);
for(int i=1; i<=m; i++) read(M[i]);
// M_pre();
precost();
// pre_M();
ST_pre();
sort(a+1, a+1+n);
int l = 0, r = a[n/2+1];
while(l < r) {
int mid = l + r >> 1;
ll cost = check(mid);
if(cost >= 0 && cost <= K) r = mid;
else l = mid + 1;
}
printf("%lld\n", l);
}
signed main() {
#ifdef LOCAL_TEST
freopen("test.in", "r", stdin);
#endif
int times = 1;
read(times);
preprim();
while(times--) {
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 8ms
memory: 17092kb
input:
3 3 5 0 2 5 2 3 2 4 6 13 3 5 3 2 5 3 3 2 4 6 13 3 5 6 2 5 2 3 2 4 6 13
output:
2 2 1
result:
ok 3 number(s): "2 2 1"
Test #2:
score: 0
Accepted
time: 36ms
memory: 18864kb
input:
100000 5 10 5 3 7 1 10 10 11 6 11 6 1 8 9 1 3 1 5 6 51 2 2 2 5 1 42 61 26 59 100 54 5 10 76 7 5 8 4 7 97 4 44 83 61 45 24 88 44 44 5 8 90 1 1 5 1 3 35 15 53 97 71 83 26 7 5 3 52 1 1 3 1 1 22 6 93 5 6 28 6 6 1 3 1 9 31 2 19 10 27 5 8 31 3 6 2 1 2 32 29 13 7 57 34 9 5 5 6 75 3 3 4 5 4 40 56 38 60 17 3...
output:
0 2 0 0 0 0 0 0 3 4 0 0 0 0 1 1 0 0 0 0 1 1 0 2 2 0 0 0 0 0 2 0 0 0 2 2 0 1 0 0 0 0 1 0 2 4 1 1 0 0 2 0 0 7 0 1 0 0 0 1 1 0 1 0 1 0 0 2 1 0 6 3 0 0 1 0 2 0 0 3 0 1 0 1 0 2 0 0 0 0 1 2 1 4 0 0 0 0 0 0 1 2 2 1 2 2 0 1 1 0 0 0 0 0 1 2 1 4 1 0 4 1 2 1 0 0 0 0 1 2 1 0 0 2 3 1 0 1 1 1 0 1 5 0 1 2 0 2 0 0 ...
result:
ok 100000 numbers
Test #3:
score: 0
Accepted
time: 19ms
memory: 16920kb
input:
30000 11 7 88 4 6 1 2 1 7 3 3 2 6 3 44 60 14 92 55 88 13 11 11 36 8 9 2 9 1 7 1 7 9 3 8 67 13 49 55 23 18 45 33 8 8 66 11 8 10 3 4 6 3 5 3 1 1 7 5 7 4 14 12 15 21 15 11 7 11 5 65 1 5 3 3 5 1 3 4 5 5 1 27 22 18 56 53 11 8 31 7 6 4 3 1 2 5 1 3 2 7 56 64 56 52 1 10 42 38 11 6 90 6 1 5 3 6 2 2 2 3 1 1 8...
output:
0 1 3 1 0 1 0 1 1 1 1 0 2 1 0 2 2 6 0 0 0 3 1 2 1 1 0 0 2 0 1 6 2 0 0 0 0 2 0 0 0 0 2 1 2 1 0 1 0 0 0 1 1 2 5 1 0 0 7 3 1 3 3 2 0 0 0 3 2 2 0 2 2 3 0 1 0 7 4 0 3 0 1 1 5 0 4 1 4 0 1 2 4 0 2 1 0 1 0 0 4 0 0 2 1 0 0 1 0 1 0 0 0 1 1 0 0 5 2 0 0 0 2 0 0 0 2 0 0 0 0 0 1 1 2 3 1 0 0 0 4 4 0 2 0 3 4 0 1 1 ...
result:
ok 30000 numbers
Test #4:
score: 0
Accepted
time: 16ms
memory: 16868kb
input:
10000 21 2 301 2 1 1 2 1 1 1 2 1 2 2 2 2 2 2 2 1 2 1 1 2 91 73 21 16 233 1 6 6 8 10 10 9 3 8 8 8 7 11 6 7 11 9 13 13 11 11 29 88 36 42 98 53 65 44 31 58 27 36 34 51 33 26 21 35 699 11 33 22 24 34 33 24 16 5 12 8 26 34 4 1 33 10 3 9 21 10 56 27 39 44 44 53 75 14 57 20 51 69 85 15 29 50 76 79 37 6 17 ...
output:
1 6 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 11 0 0 0 0 1 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0...
result:
ok 10000 numbers
Test #5:
score: -100
Time Limit Exceeded
input:
10 99999 48959 549895809 17383 33522 48377 31386 19330 13043 27394 37249 36294 12722 8373 37625 12026 13690 14053 30528 16342 31971 17759 23330 19377 6906 2676 9898 35581 3357 38474 28896 7227 46575 20055 8860 38630 48009 37394 20074 31995 24762 36589 33677 5802 16186 22579 2830 43898 14963 41255 30...