답안 #222184

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
222184 2020-04-12T09:45:14 Z VEGAnn Akvizna (COCI19_akvizna) C++14
10 / 130
1500 ms 49040 KB
#include <bits/stdc++.h>
#define sz(x) ((int)x.size())
#define pii pair<int,int>
#define ft first
#define sd second
#define MP make_pair
#define all(x) x.begin(),x.end()
#define PB push_back
using namespace std;
typedef long long ll;
typedef long double ld;
const int N = 100100;
const ll OO = 1e18;
const ld E = 1e-9;
vector<int> vc;
pair<ld, int> f[N];
int n, k;
 
struct line{
    ld k, b;
    int bl;
 
    line(): k(0.0), b(0.0), bl(0) {}
    line(ld _k, ld _b, int i): k(_k), b(_b), bl(i) {}
};
 
deque<line> hull;
 
ld get_cross_point(line fi, line se){
    return (fi.b - se.b) / (se.k - fi.k);
}
 
void insert(line nw){
    if (sz(hull) == 0){
        hull.PB(nw);
        return;
    }
 
    while (sz(hull) > 1){
        ld pt1 = get_cross_point(nw, hull[1]);
        ld pt2 = get_cross_point(hull.back(), hull[0]);
 
        if (pt2 > pt1) break;
 
        hull.pop_front();
    }
 
    hull.push_front(nw);
}
 
bool check(ld extra){
    fill(f, f + n + 1, MP(-1.0, 0));
 
    f[n] = MP(0.0, 0);
 
    insert({-1.0 / ld(n), f[n].ft + 1.0, 0});
 
    for (int j = n - 1; j >= 0; j--){
 
        if (sz(hull)) {
 
            int l = 0, r = sz(hull) - 1;
 
            while (l < r) {
                int md = (l + r + 1) >> 1;
 
                assert(md > 0);
 
                if (get_cross_point(hull[md], hull[md - 1]) + E <= j)
                    l = md;
                else r = md - 1;
            }
 
            f[j] = MP(hull[l].b + hull[l].k * ld(j) + extra, hull[l].bl + 1);
        }
 
        // may be this should be after update f[i][j]
        if (f[j].ft >= -E)
            insert({-1.0 / ld(j), f[j].ft + 1.0, f[j].sd});
    }
 
    return (f[0].sd <= k);
}
 
int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
 
//    freopen("in.txt","r",stdin);
 
    cin >> n >> k;
 
    ld l = 0, r = ld(1e8);
 
    check(0);
 
    if (f[0].sd != k) {
        for (int it = 0; it < 100; it++){
            ld md = (l + r) / 2.0;
 
            if (check(-md))
                r = md;
            else l = md;
 
            if (f[0].sd == k){
                l = md;
                break;
            }
        }
 
    }
 
    check(-l);
  
    cout << fixed << setprecision(10) << f[0].ft + l * ld(k);
 
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 436 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 288 KB Output is correct
2 Correct 6 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 99 ms 2272 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 106 ms 2528 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 109 ms 2936 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 124 ms 4448 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 115 ms 4216 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 99 ms 3064 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 105 ms 2032 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 105 ms 2316 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 110 ms 2168 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1586 ms 49040 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1599 ms 35580 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1601 ms 46352 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1599 ms 21204 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1599 ms 47104 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1589 ms 47268 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1601 ms 33136 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1598 ms 36832 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1599 ms 26204 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1600 ms 35748 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1599 ms 32216 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1596 ms 32340 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1594 ms 32212 KB Time limit exceeded
2 Halted 0 ms 0 KB -