Cod sursa(job #1483610)

Utilizator akaprosAna Kapros akapros Data 9 septembrie 2015 17:02:35
Problema Secventa 3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
#define maxN 30002
#define maxA 100000
#define ll long long
using namespace std;
int n, i, j, l, u;
ll s[maxN];
struct elem
{
    int c, t;
}v[maxN];
deque < int > d;
void read()
{
    freopen("secv3.in", "r", stdin);
    scanf("%d %d %d", &n, &l, &u);
    for (i = 1; i <= n; ++ i)
        scanf("%d", &v[i].c),
             v[i].c *= 100;
    for (i = 1; i <= n; ++ i)
        scanf("%d", &v[i].t);
}
bool ok(int x)
{
    int i;
    for (i = 1; i <= n; ++ i)
        s[i] = s[i - 1] + v[i].c - x * v[i].t * 1LL;
    d.clear();
    for (i = l; i <= n; ++ i)
    {
        while (!d.empty() && s[i - l] <= s[d.back()])
            d.pop_back();
        d.push_back(i - l);

        if (!d.empty() && i - d.front() > u)
            d.pop_front();
        if (!d.empty() && s[i] - s[d.front()] >= 0)
            return 1;
    }
    return 0;
}
double bs()
{
    int i = 0, p = 1 << 16;
    double nr;
    while (p)
    {
        if (i + p <= maxA && ok(i + p))
            i += p;
        p /= 2;
    }
    nr = i * 1.00;
    nr = (double)(nr / 100);
    return nr;
}
void write()
{
    freopen("secv3.out", "w", stdout);
    printf("%.2lf\n", bs());
}
int main()
{
    read();
    write();
    return 0;
}