Submission #780435

# Submission time Handle Problem Language Result Execution time Memory
780435 2023-07-12T08:59:38 Z vjudge1 Factories (JOI14_factories) C++17
100 / 100
3860 ms 177508 KB
#pragma GCC optimize("Ofast")
#pragma GCC target("sse4")
 
#include<bits/stdc++.h>
#include "factories.h"
using namespace std;
#define ll long long
#define ull unsigned long long
#define int128 __int128_t
#define double long double
#define gcd __gcd
#define lcm(a, b) ((a)/gcd(a, b)*(b))
#define sqrt sqrtl
#define log2 log2l
#define log10 log10l
#define floor floorl
#define to_string str
#define yes cout << "YES"
#define no cout << "NO"
#define trav(i, a) for (auto &i: (a))
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define sz(a) (int)a.size()
#define Max(a) *max_element(all(a))
#define Min(a) *min_element(all(a))
#define Find(a, n) (find(all(a), n) - a.begin())
#define Count(a, n) count(all(a), n)
#define Upper(a, n) (upper_bound(all(a), n) - a.begin())
#define Lower(a, n) (lower_bound(all(a), n) - a.begin())
#define next_perm(a) next_permutation(all(a))
#define prev_perm(a) prev_permutation(all(a))
#define sorted(a) is_sorted(all(a))
#define sum(a) accumulate(all(a), 0)
#define sumll(a) accumulate(all(a), 0ll)
#define Sort(a) sort(all(a))
#define Reverse(a) reverse(all(a))
#define Unique(a) Sort(a), (a).resize(unique(all(a)) - a.begin())
#define pb push_back
#define eb emplace_back
#define open(s) freopen(s, "r", stdin)
#define write(s) freopen(s, "w", stdout)
#define fileopen(s) open((string(s) + ".inp").c_str()), write((string(s) + ".out").c_str());
#define For(i, a, b) for (auto i = (a); i < (b); i++)
#define Fore(i, a, b) for (auto i = (a); i >= (b); i--)
#define FOR(i, a, b) for (auto i = (a); i <= (b); i++)
#define ret(s) return void(cout << s);

const int mod = 1e9 + 7, mod2 = 998244353;
const double PI = acos(-1);
const ull npos = string::npos;
const int dx[] = {0, 0, -1, 1}, dy[] = {-1, 1, 0, 0};
using pii = pair<int, int>;
using pll = pair<ll, ll>;
mt19937 mt(chrono::system_clock::now().time_since_epoch().count());
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<double> vdo;
typedef vector<vdo> vvdo;
typedef vector<string> vs;
typedef vector<pii> vpair;
typedef vector<vpair> vvpair;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef vector<char> vc;
typedef vector<vc> vvc;
typedef priority_queue<int> pq;
typedef priority_queue<int, vi, greater<int>> pqg;
typedef priority_queue<ll> pqll;
typedef priority_queue<ll, vll, greater<ll>> pqgll;
 
ll power(ll a, ll b, int m){ll x = 1;a%=m;while (b) {if (b & 1) x = x*a % m;a = a*a % m;b>>=1;}return x;}
ll power(ll a, ll b){ll x = 1;while (b) {if (b & 1) x = x*a;a = a*a;b>>=1;}return x;}
ll ceil(ll a, ll b){return (a + b - 1)/b;}
ll to_int(const string &s){ll x = 0; for (int i = (s[0] == '-'); i < sz(s); i++) x = x*10 + s[i] - '0';return x*(s[0] == '-' ? -1: 1);}
bool is_prime(ll n) {if (n < 2) return 0;if (n < 4) return 1;if (n % 2 == 0 || n % 3 == 0) return 0;for (ll i = 5; i*i <= n; i+=6) {if(n % i == 0 || n % (i + 2) == 0) return 0;}return 1;}
bool is_square(ll n) {ll k = sqrt(n); return k*k == n;}
ll factorial(int n) {ll x = 1;for (int i = 2; i <= n; i++) x*=i;return x;}
ll factorial(int n, int m) {ll x = 1;for (ll i = 2; i <= n; i++) x = x*i % m;return x;}
bool is_power(ll n, ll k) {while (n % k == 0) n/=k;return n == 1ll;}
string str(ll n) {if (n == 0) return "0"; string s = ""; bool c = 0; if (n < 0) c = 1, n = -n; while (n) {s+=n % 10 + '0'; n/=10;} if (c) s+='-'; Reverse(s); return s;}
string repeat(const string &s, int n) {if (n < 0) return ""; string x = ""; while (n--) x+=s; return x;}
string bin(ll n) {string s = ""; while (n) {s+=(n & 1) + '0'; n>>=1;} Reverse(s); return s;}
void sieve(vector<bool> &a) {int n = a.size(); a[0] = a[1] = 0; for (int i = 4; i < n; i+=2) a[i] = 0; for (int i = 3; i*i < n; i+=2) {if (a[i]) {for (int j = i*i; j < n; j+=(i << 1)) a[j] = 0;}}}
void sieve(vector<int> &a) {int n = a.size(); for (int i = 2; i < n; i+=2) a[i] = 2; for (int i = 3; i*i < n; i+=2) {if (!a[i]) {for (int j = i; j < n; j+=(i << 1)) a[j] = i;}} for (int i = 3; i < n; i+=2) {if (!a[i]) a[i] = i;}}
void sieve(int a[], int n) {for (int i = 2; i < n; i+=2) a[i] = 2; for (int i = 3; i*i < n; i+=2) {if (!a[i]) {for (int j = i; j < n; j+=(i << 1)) a[j] = i;}} for (int i = 3; i < n; i+=2) {if (!a[i]) a[i] = i;}}
vector<pii> factorize(int n) {vector<pii> a; for (int i = 2; i*i <= n; i++) {if (n % i == 0) {int k = 0; while (n % i == 0) k++, n/=i; a.emplace_back(i, k);}} if (n > 1) a.emplace_back(n, 1); return a;}
int rand(int l, int r) {return uniform_int_distribution<int>(l, r)(mt);}
int Log2(int n) {return 31 - __builtin_clz(n);}
template<class T> void compress(vector<T> &a) {vector<T> b; for (T &i: a) b.push_back(i); sort(all(b)); b.resize(unique(all(b)) - b.begin()); for (T &i: a) i = lower_bound(all(b), i) - b.begin() + 1;}

template<class A, class B> istream& operator>>(istream& in, pair<A, B> &p) {in >> p.first >> p.second; return in;}
template<class A, class B> ostream& operator<<(ostream& out, const pair<A, B> &p) {out << p.first << ' ' << p.second; return out;}
template<class T> istream& operator>>(istream& in, vector<T> &a) {for (auto &i: a) in >> i; return in;}
template<class T> ostream& operator<<(ostream& out, const vector<T> &a) {for (auto &i: a) out << i << ' '; return out;}
template<class T> istream& operator>>(istream& in, vector<vector<T>> &a) {for (auto &i: a) in >> i; return in;}
template<class T> ostream& operator<<(ostream& out, const vector<vector<T>> &a) {for (auto &i: a) out << i << '\n'; return out;}
template<class T> istream& operator>>(istream& in, deque<T> &a) {for (auto &i: a) in >> i; return in;}
template<class T> ostream& operator<<(ostream& out, const deque<T> &a) {for (auto &i: a) out << i << ' '; return out;}
// istream& operator>>(istream& in, __int128_t &a) {string s; in >> s; a = 0; for (auto &i: s) a = a*10 + (i - '0'); return in;}
// ostream& operator<<(ostream& out, __int128_t a) {string s = ""; while (a > 0) {s+=(int)a % 10 + '0'; a/=10;} Reverse(s); out << s; return out;}

const int N = 5e5 + 3;
int n, ti = 0, p[N], d[N], up[20][N], in[N], out[N], tp[N];
ll dp1[N], dp2[N], w[N];
vector<pair<int, ll>> g[N], e[N];
bool ck[N];
void dfs(int u, int par) {
    in[u] = ++ti;
    trav(v,g[u]){
        if (v.first == par) continue;
        p[v.first] = u;
        d[v.first] = d[u] + 1;
        w[v.first] = w[u] + v.second;
        dfs(v.first, u);
    }
    out[u] = ti;
}
void pre() {
    For(i,0,n) up[0][i] = p[i];
    FOR(i,1,19){
        For(j,0,n){
            up[i][j] = up[i - 1][up[i - 1][j]];
        }
    }
}
int lca(int u, int v) {
    if (d[u] < d[v]) swap(u, v);
    int k = d[u] - d[v];
    Fore(i,19,0){
        if ((k >> i) & 1) u = up[i][u];
    }
    if (u == v) return u;
    Fore(i,19,0){
        if (up[i][u] != up[i][v]) {
            u = up[i][u]; v = up[i][v];
        }
    }
    return up[0][u];
}
bool anc(int u, int v) {
    return in[u] <= in[v] && out[u] >= out[v];
}
void Dfs(int u) {
    ck[u] = 1;
    dp1[u] = dp2[u] = 1e18;
    if (tp[u] == 1) dp1[u] = 0;
    if (tp[u] == 2) dp2[u] = 0;
    trav(v,e[u]) {
        if (!ck[v.first]) {
            Dfs(v.first);
            dp1[u] = min(dp1[u], dp1[v.first] + v.second);
            dp2[u] = min(dp2[u], dp2[v.first] + v.second);
        }
    }
}
void Init(int _n, int a[], int b[], int c[]) {
    n = _n;
    For(i,0,n-1){
        g[a[i]].eb(b[i], c[i]); g[b[i]].eb(a[i], c[i]);
    }
    dfs(0, -1); pre();
}
ll Query(int s, int a[], int t, int b[]) {
    vi c;
    For(i,0,s) c.pb(a[i]), tp[a[i]] = 1;
    For(i,0,t) c.pb(b[i]), tp[b[i]] = 2;
    sort(all(c), [&](int i, int j){
        return in[i] < in[j];
    });
    For(i,0,s+t-1){
        int l = lca(c[i], c[i + 1]);
        if (l != c[i] && l != c[i + 1]) c.pb(l);
    }
    sort(all(c), [&](int i, int j){
        return in[i] < in[j];
    });
    stack<int> st;
    For(i,0,sz(c)){
        while (sz(st) && !anc(st.top(), c[i])) st.pop();
        if (sz(st)) {
            e[st.top()].eb(c[i], w[c[i]] - w[st.top()]);
            e[c[i]].eb(st.top(), w[c[i]] - w[st.top()]);
        }
        st.push(c[i]);
    }
    int r = c[0];
    Dfs(r);
    ll x = 1e18;
    trav(i,c) {
        x = min(x, dp1[i] + dp2[i]);
        dp1[i] = dp2[i] = 1e18;
        e[i].clear();
        tp[i] = 0;
        ck[i] = 0;
    }
    return x;
}
# Verdict Execution time Memory Grader output
1 Correct 28 ms 24404 KB Output is correct
2 Correct 772 ms 33376 KB Output is correct
3 Correct 744 ms 33376 KB Output is correct
4 Correct 728 ms 33576 KB Output is correct
5 Correct 607 ms 33476 KB Output is correct
6 Correct 605 ms 33344 KB Output is correct
7 Correct 747 ms 33228 KB Output is correct
8 Correct 729 ms 33456 KB Output is correct
9 Correct 616 ms 33480 KB Output is correct
10 Correct 586 ms 33348 KB Output is correct
11 Correct 751 ms 33336 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 15 ms 24160 KB Output is correct
2 Correct 1667 ms 137488 KB Output is correct
3 Correct 2213 ms 141692 KB Output is correct
4 Correct 1180 ms 134948 KB Output is correct
5 Correct 1875 ms 176728 KB Output is correct
6 Correct 2436 ms 143212 KB Output is correct
7 Correct 1609 ms 56396 KB Output is correct
8 Correct 917 ms 55428 KB Output is correct
9 Correct 917 ms 61860 KB Output is correct
10 Correct 1535 ms 57560 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 28 ms 24404 KB Output is correct
2 Correct 772 ms 33376 KB Output is correct
3 Correct 744 ms 33376 KB Output is correct
4 Correct 728 ms 33576 KB Output is correct
5 Correct 607 ms 33476 KB Output is correct
6 Correct 605 ms 33344 KB Output is correct
7 Correct 747 ms 33228 KB Output is correct
8 Correct 729 ms 33456 KB Output is correct
9 Correct 616 ms 33480 KB Output is correct
10 Correct 586 ms 33348 KB Output is correct
11 Correct 751 ms 33336 KB Output is correct
12 Correct 15 ms 24160 KB Output is correct
13 Correct 1667 ms 137488 KB Output is correct
14 Correct 2213 ms 141692 KB Output is correct
15 Correct 1180 ms 134948 KB Output is correct
16 Correct 1875 ms 176728 KB Output is correct
17 Correct 2436 ms 143212 KB Output is correct
18 Correct 1609 ms 56396 KB Output is correct
19 Correct 917 ms 55428 KB Output is correct
20 Correct 917 ms 61860 KB Output is correct
21 Correct 1535 ms 57560 KB Output is correct
22 Correct 3218 ms 152684 KB Output is correct
23 Correct 3146 ms 152304 KB Output is correct
24 Correct 3262 ms 156848 KB Output is correct
25 Correct 3450 ms 159076 KB Output is correct
26 Correct 3860 ms 147788 KB Output is correct
27 Correct 2536 ms 177508 KB Output is correct
28 Correct 2263 ms 145944 KB Output is correct
29 Correct 3794 ms 146228 KB Output is correct
30 Correct 3771 ms 145408 KB Output is correct
31 Correct 3766 ms 146016 KB Output is correct
32 Correct 1078 ms 63668 KB Output is correct
33 Correct 1155 ms 63832 KB Output is correct
34 Correct 1565 ms 55988 KB Output is correct
35 Correct 1654 ms 55696 KB Output is correct
36 Correct 1634 ms 56548 KB Output is correct
37 Correct 1611 ms 56348 KB Output is correct