답안 #243449

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
243449 2020-07-01T08:02:37 Z ne4eHbKa Kvalitetni (COCI16_kvalitetni) C++17
120 / 120
18 ms 2432 KB
//{ <defines>
#include <bits/stdc++.h>
using namespace std;

//#pragma comment(linker, "/stack:200000000")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,-O3")

#define fr(i, n) for(int i = 0; i < n; ++i)
#define fo(n) fr(i, n)

#define re return
#define ef else if
#define ifn(x) if(!(x))
#define _  << ' ' <<

#define ft first
#define sd second
#define ve vector
#define pb push_back
#define eb emplace_back

#define sz(x) int((x).size())
#define bnd(x) x.begin(), x.end()
#define clr(x, y) memset((x), (y), sizeof (x))

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef ve<int> vi;

inline ll time() {re chrono :: system_clock().now().time_since_epoch().count();}
mt19937 rnd(time());
mt19937_64 RND(time());

template<typename t> inline void umin(t &a, t b) {a = min(a, b);}
template<typename t> inline void umax(t &a, t b) {a = max(a, b);}

int md = 998244353;

inline int m_add(int&a, int b) {a += b; if(a < 0) a += md; if(a >= md) a -= md; re a;}
inline int m_sum(int a, int b) {a += b; if(a < 0) a += md; if(a >= md) a -= md; re a;}
inline int m_mul(int&a, int b) {re a = 1ll * a * b % md;}
inline int m_prod(int a, int b) {re 1ll * a * b % md;}

int m_bpow(ll A, ll b) {
    int a = A % md;
    ll ans = 1;
    for(ll p = 1ll << 63 - __builtin_clzll(b); p; p >>= 1) {
        (ans *= ans) %= md;
        if(p & b)
            (ans *= a) %= md;
    }
    re ans;
}

//const ld pi = arg(complex<ld>(-1, 0));
//const ld pi2 = pi + pi;
const int oo = 2e9;
const ll OO = 4e18;
//} </defines>
const int K = 50;
const int N = 1e6 + 5;

int k, z[N];
char c[N];
int br[N];

ld rec(char *c, int *b, int n) {
    if(n == 1) re z[0];
    list<ld> f;
    char action;
    for(int i = 0; i < n; i += b[i] + 1) {
        if(i) action = c[i - 1];
        f.push_back(rec(c + i + 1, b + i + 1, b[i] - 2));
    }
    ld lim = z[f.size() - 1];
    ld ans;
    if(action == '+') {
        ans = 0;
        for(ld i : f) {
            ans += i;
            umin(ans, lim);
        }
    }
    if(action == '*') {
        vector<ld> t(f.begin(), f.end());
        sort(t.rbegin(), t.rend());
        ld s = accumulate(t.begin(), t.end(), ld(0)) - lim;
        if(s > 0) {
            int n = t.size();
            ld v = 0;
            for(int i = 0; i < n; ++i) {
                v += t[i];
                if(v < s) continue;
                ld u = (v - s) / (i + 1);
                if(i + 1 < n && t[i + 1] > u) continue;
                for(int j = 0; j <= i; ++j) t[j] = u;
                break;
            }
        }
        ans = 1;
        for(ld i : t) ans *= i;
    }
    re ans;
}

void solve() {
    cin >> k; fo(k) cin >> z[i];
    while(cin.peek() != '(') cin.get();
    stack<int> b;
    for(int i = 0; ; ++i) {
        char f = cin.get();
        if(f == '(') b.push(i);
        if(f == ')') {
            br[b.top()] = i - b.top() + 1;
            b.pop();
        }
        c[i] = f;
        if(b.empty()) break;
    }
    cout << rec(c + 1, br + 1, *br - 2) << endl;
}

int main() {
    cout.precision(15); cout << fixed;
    cerr.precision(15); cerr << fixed;
#ifdef _LOCAL
    freopen("in.txt", "r", stdin);
    int tests; cin >> tests;
    for(int test = 1; test <= tests; ++test) {
		cerr << "case #" << test << endl;
        solve();
        cerr << endl;
    }
#else
//    freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
    ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
    solve();
#endif
    return 0;
}

Compilation message

kvalitetni.cpp: In function 'int m_bpow(ll, ll)':
kvalitetni.cpp:50:26: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
     for(ll p = 1ll << 63 - __builtin_clzll(b); p; p >>= 1) {
                       ~~~^~~~~~~~~~~~~~~~~~~~
kvalitetni.cpp: In function 'ld rec(char*, int*, int)':
kvalitetni.cpp:80:5: warning: 'action' may be used uninitialized in this function [-Wmaybe-uninitialized]
     if(action == '+') {
     ^~
kvalitetni.cpp:79:8: warning: 'ans' may be used uninitialized in this function [-Wmaybe-uninitialized]
     ld ans;
        ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 384 KB Output is correct
2 Correct 6 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 12 ms 1664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 896 KB Output is correct
2 Correct 13 ms 1664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 1408 KB Output is correct
2 Correct 18 ms 2432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 1152 KB Output is correct
2 Correct 18 ms 2304 KB Output is correct