Submission #312689

#TimeUsernameProblemLanguageResultExecution timeMemory
312689YJUConstruction of Highway (JOI18_construction)C++14
100 / 100
357 ms8688 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("unroll-loops,no-stack-protector")
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pll;
const ll MOD=1e9+7;
const ll MOD2=998244353;
const ll K=350;
const ld pi=3.14159265359;
const ll INF=(1LL<<40);
#define SQ(i) ((i)*(i))
#define REP(i,n) for(ll i=0;i<n;i++)
#define REP1(i,n) for(ll i=1;i<=n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define setp setprecision
#define lwb lower_bound
#define SZ(_a) (ll)_a.size()

const int N = 1e5 + 7;

struct LCT {
    int f[N], ch[N][2], s[N], z[N], a[N];
    #define lc ch[p][0]
    #define rc ch[p][1]
    #define upd(p) s[p] = s[ch[p][0]] + s[ch[p][1]] + 1
    #define get(p) (p == ch[f[p]][1])
    #define rev(p) v[p] ^= 1, swap(ch[p][0], ch[p][1])
    #define isrt(p) (ch[f[p]][0] != p && ch[f[p]][1] != p)
    inline void spd(int p) {
        if (z[p]) {
            if (lc) a[lc] = z[lc] = z[p];
            if (rc) a[rc] = z[rc] = z[p];
            z[p] = 0;
        }
    }
    inline void rot(int p) {
        int x = f[p], y = f[x], u = get(p), v = get(x), o = isrt(x);
        f[ch[p][u^1]] = x, ch[x][u] = ch[p][u^1];
        f[x] = p, ch[p][u^1] = x, upd(x), upd(p);
        if ((f[p] = y) && !o) ch[y][v] = p;
    }
    void pre(int p) {
        if (!isrt(p)) pre(f[p]);
        spd(p);
    }
    inline void splay(int p) {
        pre(p);
        for (int x = f[p]; !isrt(p); rot(p), x = f[p])
            if (!isrt(x)) rot(get(p) == get(x) ? x : p);
    }
    inline vector<pll> access(int p) {
        vector<pll> ret;
        int w = 0;
        for (int x = 0; p; p = f[x=p])
            splay(p), rc = x, upd(p),
            ret.pb(mp(a[p], s[p] - w)), w = s[p];
        return ret;
    }
    inline void link(int p, int x) {
        int w = a[x];
        splay(p), rc = x, f[x] = p, splay(x), upd(x), a[x] = z[x] = w;
    }
} lct;

struct BIT {
    vector<ll> c;
    inline BIT() {}
    inline BIT(int n) { c.resize(n); }
    inline void add(ll x, ll k) {
        while (x < c.size()) c[x] += k, x += x & -x;
    }
    inline ll ask(ll x) {
        ll k = 0;
        while (x) k += c[x], x -= x & -x;
        return k;
    }
};

int n, a[N];

int main() {
	ios_base::sync_with_stdio(0);cin.tie(0);
	cin>>n;
    for (int i = 1; i <= n; i++) cin>>a[i], lct.a[i] = a[i];
    sort(a + 1, a + n + 1);
    int t = unique(a + 1, a + n + 1) - (a + 1);
    BIT c(t + 1);
    for (int i = 1; i <= n; i++)
        lct.a[i] = lower_bound(a + 1, a + t + 1, lct.a[i]) - a;
    lct.s[1] = 1;
    for (int i = 1, x, y; i < n; i++) {
    	cin>>x>>y;
        auto ret = lct.access(x);
        ll ans = 0;
        for (pll o : ret)
            ans += o.se * c.ask(o.fi - 1), c.add(o.fi, o.se);
            cout<<ans<<"\n";
        for (pll o : ret) c.add(o.fi, -o.se);
        lct.link(x, y);
    }
    return 0;
}

Compilation message (stderr)

construction.cpp: In member function 'void BIT::add(ll, ll)':
construction.cpp:74:18: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |         while (x < c.size()) c[x] += k, x += x & -x;
      |                ~~^~~~~~~~~~
construction.cpp: In function 'int main()':
construction.cpp:99:9: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   99 |         for (pll o : ret)
      |         ^~~
construction.cpp:101:13: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  101 |             cout<<ans<<"\n";
      |             ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...