QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#108031#5418. Color the TreeHaccerKatWA 112ms3536kbC++207.8kb2023-05-23 14:40:142023-05-23 14:40:16

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-23 14:40:16]
  • 评测
  • 测评结果:WA
  • 用时:112ms
  • 内存:3536kb
  • [2023-05-23 14:40:14]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
template<typename T>
int SIZE(T (&t)){
    return t.size();
}

template<typename T, size_t N>
int SIZE(T (&t)[N]){
    return N;
}

string to_string(char t){
    return "'" + string({t}) + "'";
}

string to_string(bool t){
    return t ? "true" : "false";
}

string to_string(const string &t, int x1=0, int x2=1e9){
    string ret = "";
    for(int i = min(x1,SIZE(t)), _i = min(x2,SIZE(t)-1); i <= _i; ++i){
        ret += t[i];
    }
    return '"' + ret + '"';
}

string to_string(const char* t){
    string ret(t);
    return to_string(ret);
}

template<size_t N>
string to_string(const bitset<N> &t, int x1=0, int x2=1e9){
    string ret = "";
    for(int i = min(x1,SIZE(t)); i <= min(x2,SIZE(t)-1); ++i){
        ret += t[i] + '0';
    }
    return to_string(ret);
}

template<typename T, typename... Coords>
string to_string(const T (&t), int x1=0, int x2=1e9, Coords... C);

template<typename T, typename S>
string to_string(const pair<T, S> &t){
    return "(" + to_string(t.first) + ", " + to_string(t.second) + ")";
}

template<typename T, typename... Coords>
string to_string(const T (&t), int x1, int x2, Coords... C){
    string ret = "[";
    x1 = min(x1, SIZE(t));
    auto e = begin(t);
    advance(e,x1);
    for(int i = x1, _i = min(x2,SIZE(t)-1); i <= _i; ++i){
        ret += to_string(*e, C...) + (i != _i ? ", " : "");
        e = next(e);
    }
    return ret + "]";
}

template<int Index, typename... Ts>
struct print_tuple{
    string operator() (const tuple<Ts...>& t) {
        string ret = print_tuple<Index - 1, Ts...>{}(t);
        ret += (Index ? ", " : "");
        return ret + to_string(get<Index>(t));
    }
};

template<typename... Ts>
struct print_tuple<0, Ts...> {
    string operator() (const tuple<Ts...>& t) {
        return to_string(get<0>(t));
    }
};

template<typename... Ts>
string to_string(const tuple<Ts...>& t) {
    const auto Size = tuple_size<tuple<Ts...>>::value;
    return print_tuple<Size - 1, Ts...>{}(t);
}

void dbgr(){;}
template<typename Heads, typename... Tails>
void dbgr(Heads H, Tails... T){
    cout << to_string(H) << " | ";
    dbgr(T...);
}

void dbgs(){;}
template<typename Heads, typename... Tails>
void dbgs(Heads H, Tails... T){
    cout << H << " ";
    dbgs(T...);
}

/*
formatted functions:
*/

/*
consider __VA_ARGS__ as a whole:
dbgv() prints values only
dbg() prints name and values
*/
#define dbgv(...) cout << to_string(__VA_ARGS__) << endl;

#define dbg(...) cout << "[" << #__VA_ARGS__ << "]: "; dbgv(__VA_ARGS__);
//#define dbg(...)

/*
consider __VA_ARGS__ as a sequence of arguments:
dbgr() prints values only
dbgm() prints names and values
*/
#define dbgr(...) dbgr(__VA_ARGS__); cout << endl;

#define dbgm(...) cout << "[" << #__VA_ARGS__ << "]: "; dbgr(__VA_ARGS__);

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
typedef pair<int, int> pi;
typedef pair<ll, ll> pll;
// using u128 = __uint128_t;
// using i128 = __int128;
const int mod = 1000000007;
const int N = 200005;
const int LOG = 17;
const int inf = 1e9;
const double eps = 1e-11;
string s;
int n, m, k, qq;
void solve() {
    cin >> n;
    vector<int> a(n), logA(n + 1);
    vector<vector<int>> adj(n), deps(n), rmq(n, vector<int>(LOG));
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        rmq[i][0] = a[i];
    }
    
    for (int i = 2; i <= n; i++) {
        logA[i] = logA[i / 2] + 1;
    }
    
    for (int j = 1; j < LOG; j++) {
        for (int i = 0; i < n - (1 << j) + 1; i++) {
            rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
        }
    }
    
    auto querymn = [&](int l, int r) {
        int sz = r - l + 1;
        int lg = logA[sz];
        return min(rmq[l][lg], rmq[r - (1 << lg) + 1][lg]);
    };
    
    for (int i = 0; i < n - 1; i++) {
        int u, v;
        cin >> u >> v;
        u--, v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    
    vector<bool> vis(n);
    vector<int> dep(n), tin(n), tout(n), par(n);
    par[0] = -1;
    int t = 0;
    auto dfs = [&](int u, auto dfs) -> void {
        vis[u] = true, tin[u] = t++;
        deps[dep[u]].push_back(u);
        for (int v : adj[u]) {
            if (!vis[v]) {
                dep[v] = dep[u] + 1, par[v] = u;
                dfs(v, dfs);
            }
        }
        
        tout[u] = t++;
    };
    
    dfs(0, dfs);
    vector<vector<int>> up(n, vector<int>(LOG));
    for (int j = 1; j < LOG; j++) {
        for (int i = 0; i < n; i++) {
            if (up[i][j - 1] == -1) up[i][j] = 1;
            else up[i][j] = up[up[i][j - 1]][j - 1];
        }
    }
    
    auto isancestor = [&](int u, int v) {
        return (tin[u] <= tin[v] && tout[u] >= tout[v]);
    };
    
    auto query = [&](int u, int v) {
        if (dep[u] > dep[v]) swap(u, v);
        if (isancestor(u, v)) return u;
        for (int i = LOG - 1; i >= 0; i--) {
            int w = up[u][i];
            if (w != -1 && !isancestor(w, v)) u = w;
        }
        
        return par[u];
    };
    
    vector<vector<int>> viradj(n);
    vector<int> dp(n);
    ll out = a[0];
    // dbg(deps);
    for (int i = 1; i < n; i++) {
        int sz = deps[i].size();
        if (sz == 0) break;
        vector<pi> nodes(sz);
        for (int j = 0; j < sz; j++) {
            nodes[j] = {tin[deps[i][j]], deps[i][j]};
        }
        
        sort(nodes.begin(), nodes.end());
        stack<int> stk;
        stk.push(0);
        vector<pi> used;
        used.push_back({0, 0});
        // dbg(nodes);
        for (int j = 0; j < sz; j++) {
            auto [temp, u] = nodes[j];
            used.push_back({dep[u], u});
            while (stk.size() > 1) {
                int v = stk.top();
                int lca = query(u, v);
                if (isancestor(v, u)) break;
                stk.pop();
                int vv = stk.top();
                if (dep[vv] <= dep[lca]) {
                    if (vv != lca) stk.push(lca);
                    viradj[lca].push_back(v);
                    used.push_back({dep[lca], lca});
                    break;
                }
                
                viradj[vv].push_back(v);
            }
            
            stk.push(u);
        }
        
        // dbg(viradj);
        // dbg(stk.size());
        while (stk.size() > 1) {
            int v = stk.top();
            stk.pop();
            int vv = stk.top();
            viradj[vv].push_back(v);
        }
        
        sort(used.rbegin(), used.rend());
        for (auto [d, u] : used) {
            int sum = 0, cnt = 0;
            for (int v : viradj[u]) {
                sum += dp[v], cnt++;
            }
            
            dp[u] = min((cnt == 0 ? inf : sum), querymn(i - d, i));
        }
        
        // dbg(dp);
        // dbg(viradj);
        // dbg(dp[0]);
        out += dp[0];
        for (auto [d, u] : used) {
            viradj[u].clear();
            dp[u] = 0;
        }
    }
    
    cout << out << "\n";
}

int32_t main() {
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    int tt;
    cin >> tt;
    while (tt--) {
        solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3288kb

input:

3
4
10 15 40 1
1 2
2 3
2 4
5
10 5 1 100 1000
1 2
2 3
2 4
4 5
4
1000 200 10 8
1 2
2 3
3 4

output:

35
17
1218

result:

ok 3 number(s): "35 17 1218"

Test #2:

score: -100
Wrong Answer
time: 112ms
memory: 3536kb

input:

3000
54
43 44 11 49 17 14 7 30 35 12 34 14 15 8 29 47 30 31 39 17 26 23 26 45 34 50 49 13 35 18 29 15 13 44 47 5 22 20 19 46 30 22 26 13 47 46 43 27 48 48 13 14 30 44
1 2
1 3
2 4
3 5
4 6
2 7
4 8
1 9
3 10
1 11
8 12
2 13
9 14
1 15
1 16
15 17
15 18
7 19
1 20
19 21
13 22
10 23
17 24
9 25
9 26
24 27
8 28...

output:

138
92
131
179
127
227
221
104
100
79
139
73
129
91
143
81
153
179
104
127
111
99
75
173
174
259
128
168
84
87
180
177
79
246
197
143
150
179
121
112
109
114
165
123
220
144
122
73
149
59
56
31
115
131
165
102
95
163
53
95
172
134
169
134
211
58
151
231
80
294
142
123
122
144
197
253
72
202
65
193
9...

result:

wrong answer 1st numbers differ - expected: '180', found: '138'