Submission #432534

#TimeUsernameProblemLanguageResultExecution timeMemory
4325342qbingxuan말 (IOI15_horses)C++17
100 / 100
410 ms52176 KiB
#pragma GCC optimize("Ofast")
#include "horses.h"
#include <bits/stdc++.h>
#ifdef local
#define debug(a...) qqbx(#a, a)
#define pary(a...) danb(#a, a)
#define safe std::cerr<<__PRETTY_FUNCTION__<<" line "<<__LINE__<<" safe\n"
template <typename ...T> void qqbx(const char *s, T ...a) {
    int cnt = sizeof...(T);
    ((std::cerr << "\e[1;32m(" << s << ") = ("), ..., (std::cerr << a << (--cnt ? ", " : ")\e[0m\n")));
}
template <typename T> void danb(const char *s, T L, T R) {
    std::cerr << "\e[1;32m[ " << s << " ] = [ ";
    for (int f = 0; L != R; ++L)
        std::cerr << (f++ ? ", " : "") << *L;
    std::cerr << " ]\e[0m\n";
}
#else
#define debug(...) ((void)0)
#define pary(...) ((void)0)
#define safe ((void)0)
#endif // local
#define all(v) begin(v),end(v)

using ld = long double;
using ll = long long;
using namespace std;
const int maxn = 500025;
const int mod = 1000000007;

struct Segtree {
    pair<ld,int> st[maxn * 2];
    ld lz[maxn];
    int n;
    void build(int N) {
        n = N;
        for (int i = n-1; i > 0; i--)
            st[i] = max(st[i<<1], st[i<<1|1]), lz[i] = 0;
    }
    void upd(int p, ld x) {
        st[p].first += x;
        if (p < n) lz[p] += x;
    }
    void pull(int p) {
        for (; p > 1; p>>=1) {
            st[p>>1] = max(st[p], st[p^1]);
            st[p>>1].first += lz[p>>1];
        }
    }
    void add(int l, int r, ld x) {
        int L = l, R = r;
        // push(l+n), push(r-1+n);
        for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
            if (l&1) upd(l++, x);
            if (r&1) upd(--r, x);
        }
        pull(L+n), pull(R-1+n);
    }
    int query() {
        return st[1].second;
        pair<ld,int> r;
        for (int i = 0; i < n; i++) {
            r = max(r, st[i + n]);
        }
        return r.second;
    }
} sgt;

ll modpow(ll e, ll p) {
    ll r = 1;
    while (p) {
        if (p&1) r = r*e%mod;
        e = e*e%mod;
        p >>= 1;
    }
    return r;
}
struct Fenwick {
    int n;
    ll b[maxn];
    void init(int N) {
        n = N;
        for (int i = 1; i <= n; i++) b[i] = 1;
    }
    void add(int p, ll d) {
        for (++p; p <= n; p += p&-p) b[p] = b[p] * d % mod;
    }
    ll query(int p) {
        ll r = 1;
        for (++p; p > 0; p -= p&-p) r = r * b[p] % mod;
        return r;
    }
} BIT;
int x[maxn], y[maxn], n;
int init(int N, int X[], int Y[]) {
    long double sum = 0;
    ll prod = 1;
    BIT.init(N);
    for (int i = 0; i < N; i++) {
        sum += log(X[i]);
        prod = prod * X[i] % mod;
        sgt.st[i + N] = { sum + log(Y[i]), i };
        BIT.add(i, X[i]);
    }
    sgt.build(N);
    n = N;
    for (int i = 0; i < N; i++) x[i] = X[i];
    for (int i = 0; i < N; i++) y[i] = Y[i];
    int p = sgt.query();
    return BIT.query(p) * y[p] % mod;
}

int updateX(int pos, int val) {	
    sgt.add(pos, n, -log(x[pos]));
    BIT.add(pos, modpow(x[pos], mod-2));
    x[pos] = val;
    sgt.add(pos, n, log(x[pos]));
    BIT.add(pos, x[pos]);
    int p = sgt.query();
    return BIT.query(p) * y[p] % mod;
}

int updateY(int pos, int val) {
    sgt.add(pos, pos+1, -log(y[pos]));
    y[pos] = val;
    sgt.add(pos, pos+1, log(y[pos]));
    int p = sgt.query();
    return BIT.query(p) * y[p] % mod;
}

Compilation message (stderr)

horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:110:32: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  110 |     return BIT.query(p) * y[p] % mod;
      |            ~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:120:32: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  120 |     return BIT.query(p) * y[p] % mod;
      |            ~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:128:32: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  128 |     return BIT.query(p) * y[p] % mod;
      |            ~~~~~~~~~~~~~~~~~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...