Submission #1091759

# Submission time Handle Problem Language Result Execution time Memory
1091759 2024-09-22T03:44:28 Z DucNguyen2007 Tourism (JOI23_tourism) C++14
100 / 100
4682 ms 37216 KB
#include <bits/stdc++.h>
 
using namespace std;
using ll = long long;
 
//#define int long long
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define FORD(i, a, b) for (int i = (b); i >= (a); i --)
#define REP(i, a) for (int i = 0; i < (a); ++i)
#define REPD(i, a) for (int i = (a) - 1; i >= 0; --i)
 
#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
 
 
constexpr ll LINF = (1ll << 60);
constexpr int INF = (1ll << 30);
constexpr int Mod = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
/*
    Phu Trong from Nguyen Tat Thanh High School for gifted student
*/
 
template <class X, class Y>
    bool minimize(X &x, const Y &y){
        X eps = 1e-9;
        if (x > y + eps) {x = y; return 1;}
        return 0;
    }
 
template <class X, class Y>
    bool maximize(X &x, const Y &y){
        X eps = 1e-9;
        if (x + eps < y) {x = y; return 1;}
        return 0;
    }
#define MAX                     100005
#define BLOCK_SIZE              400
#define LOG                     20
#define MIN_HIGH(u, v)          (depth[u] < depth[v] ? (u) : (v))
 
 
int numNode, numQuery, numCity;
vector<int> G[MAX];
int A[MAX];
 
struct Queries{
    int l, r, id;
    Queries(){}
    Queries(int _l, int _r, int _id): l(_l), r(_r), id(_id){}
 
    bool operator < (const Queries& oth) const{
        if (l / BLOCK_SIZE != oth.l / BLOCK_SIZE) return l < oth.l;
        return r < oth.r;
    }
} Q[MAX];
 
int ans[MAX];
 
int tin[MAX], st[MAX << 1][LOG], depth[MAX], rev[MAX], pos[MAX << 1];
int timeDfs = 0, cnt = 0;
 
int lg[MAX << 1];
void pre_dfs(int u, int p = -1){
    st[++cnt][0] = u; pos[u] = cnt;
 
    tin[u] = ++timeDfs; rev[tin[u]] = u;
 
    for (int &v : G[u]) if(v ^ p){
        depth[v] = depth[u] + 1;
        pre_dfs(v, u);
        st[++cnt][0] = u;
    }
}
 
void build(void){
    pre_dfs(1);
    for (int k = 1; MASK(k) <= cnt; ++k){
        for (int i = 1; i + MASK(k) - 1 <= cnt; ++i){
            st[i][k] = MIN_HIGH(st[i][k - 1], st[i + MASK(k - 1)][k - 1]);
        }
    }
    for (int i = 2; i <= cnt; ++i) lg[i] = lg[i >> 1] + 1;
}
int lca(int u, int v){
    int l = pos[u], r = pos[v];
    if(l > r) swap(l, r);
    int k = lg[r - l + 1];
    return MIN_HIGH(st[l][k], st[r - MASK(k) + 1][k]);
}
int dis(int a, int b){
    return depth[a] + depth[b] - 2 * depth[lca(a, b)];
}
 
namespace DistanceOnTree{
    int sum = 0;
    int F[MAX * 2];
    int low_bit(int p){
        return p & (-p);
    }
 
    void upd(int p, int v){
        for (; p <= cnt; p += low_bit(p)){
            F[p] += v;
        }
    }
 
    int query(int p){
        int res = 0;
        for (; p > 0; p -= low_bit(p)) res += F[p];
        return res;
    }
    int lower_bound(int val){
        int res = 0;
        for (int i = lg[cnt]; i >= 0; --i){
            if ((res | MASK(i)) <= cnt && val > F[res | MASK(i)]){
                val -= F[res | MASK(i)];
                res |= MASK(i);
            }
        }
        return res + 1;
    }
    int size = 0;
    int get_order(int x){
        return query(x);
    }
    int find_last(void){
        return lower_bound(size);
    }
    int find_first(void){
        return lower_bound(1);
    }
    int find_by_order(int x){
        return lower_bound(x);
    }
 
    int next[MAX], prev[MAX];
 
    int res(void){
        return sum / 2 + 1;
    }
    void ins(int x){
        x = tin[x];
        if(size){
            int i = get_order(x);
            int prv = (i > 0 ? find_by_order(i) : find_last());
            int nxt = next[prv];
 
            sum -= dis(rev[prv], rev[nxt]);
            sum += dis(rev[prv], rev[x]);
            sum += dis(rev[nxt], rev[x]);
            next[x] = nxt; prev[x] = prv;
            next[prv] = x; prev[nxt] = x;
        }
 
        upd(x, 1);
        if(!size){
            prev[x] = next[x] = x;
        }
        ++size;
    }
    void eras(int x){
        x = tin[x];
        upd(x, -1);
        --size;
        if(size){
            sum += dis(rev[prev[x]], rev[next[x]]);
            sum -= dis(rev[prev[x]], rev[x]);
            sum -= dis(rev[next[x]], rev[x]);
 
            next[prev[x]] = next[x];
            prev[next[x]] = prev[x];
        }
    }
}
#define T       DistanceOnTree
int in[MAX];
 
void sub(int x){
    in[A[x]]--;
    if(!in[A[x]])
        T :: eras(A[x]);
}
void add(int x){
    if(!in[A[x]])
        T :: ins(A[x]);
    in[A[x]]++;
}
void process(void){
    cin >> numNode >> numCity >> numQuery;
    for (int i = 1; i < numNode; ++i){
        int u, v; cin >> u >> v;
        G[u].emplace_back(v);
        G[v].emplace_back(u);
    }
    for (int i = 1; i <= numCity; ++i) cin >> A[i];
 
    for (int i = 1; i <= numQuery; ++i){
        cin >> Q[i].l >> Q[i].r;
        Q[i].id = i;
    }
    sort(Q + 1, Q + numQuery + 1);
    build();
    int L = 1, R = 0;
    for (int i = 1; i <= numQuery; ++i){
        while (L < Q[i].l) sub(L++);
        while (L > Q[i].l) add(--L);
        while (R < Q[i].r) add(++R);
        while (R > Q[i].r) sub(R--);
 
        ans[Q[i].id] = T :: res();
    }
 
    for (int i = 1; i <= numQuery; ++i){
        cout << ans[i] << '\n';
    }
}
signed main(){
    #define name "Whisper"
    cin.tie(nullptr) -> sync_with_stdio(false);
    //freopen(name".inp", "r", stdin);
    //freopen(name".out", "w", stdout);
    process();
    return (0 ^ 0);
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2648 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Correct 1 ms 2652 KB Output is correct
4 Correct 2 ms 2908 KB Output is correct
5 Correct 2 ms 2908 KB Output is correct
6 Correct 2 ms 2908 KB Output is correct
7 Correct 1 ms 2908 KB Output is correct
8 Correct 2 ms 2908 KB Output is correct
9 Correct 2 ms 2908 KB Output is correct
10 Correct 2 ms 2948 KB Output is correct
11 Correct 2 ms 2908 KB Output is correct
12 Correct 1 ms 2904 KB Output is correct
13 Correct 1 ms 2908 KB Output is correct
14 Correct 1 ms 2908 KB Output is correct
15 Correct 2 ms 2908 KB Output is correct
16 Correct 2 ms 2908 KB Output is correct
17 Correct 2 ms 2956 KB Output is correct
18 Correct 2 ms 2908 KB Output is correct
19 Correct 3 ms 2908 KB Output is correct
20 Correct 3 ms 2908 KB Output is correct
21 Correct 2 ms 2908 KB Output is correct
22 Correct 2 ms 2908 KB Output is correct
23 Correct 2 ms 2908 KB Output is correct
24 Correct 2 ms 2908 KB Output is correct
25 Correct 2 ms 2908 KB Output is correct
26 Correct 2 ms 2908 KB Output is correct
27 Correct 1 ms 2652 KB Output is correct
28 Correct 1 ms 2908 KB Output is correct
29 Correct 1 ms 2908 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2648 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Correct 1 ms 2652 KB Output is correct
4 Correct 2 ms 2908 KB Output is correct
5 Correct 2 ms 2908 KB Output is correct
6 Correct 2 ms 2908 KB Output is correct
7 Correct 1 ms 2908 KB Output is correct
8 Correct 2 ms 2908 KB Output is correct
9 Correct 2 ms 2908 KB Output is correct
10 Correct 2 ms 2948 KB Output is correct
11 Correct 2 ms 2908 KB Output is correct
12 Correct 1 ms 2904 KB Output is correct
13 Correct 1 ms 2908 KB Output is correct
14 Correct 1 ms 2908 KB Output is correct
15 Correct 2 ms 2908 KB Output is correct
16 Correct 2 ms 2908 KB Output is correct
17 Correct 2 ms 2956 KB Output is correct
18 Correct 2 ms 2908 KB Output is correct
19 Correct 3 ms 2908 KB Output is correct
20 Correct 3 ms 2908 KB Output is correct
21 Correct 2 ms 2908 KB Output is correct
22 Correct 2 ms 2908 KB Output is correct
23 Correct 2 ms 2908 KB Output is correct
24 Correct 2 ms 2908 KB Output is correct
25 Correct 2 ms 2908 KB Output is correct
26 Correct 2 ms 2908 KB Output is correct
27 Correct 1 ms 2652 KB Output is correct
28 Correct 1 ms 2908 KB Output is correct
29 Correct 1 ms 2908 KB Output is correct
30 Correct 7 ms 3164 KB Output is correct
31 Correct 9 ms 3232 KB Output is correct
32 Correct 10 ms 3360 KB Output is correct
33 Correct 11 ms 3160 KB Output is correct
34 Correct 11 ms 3164 KB Output is correct
35 Correct 3 ms 3164 KB Output is correct
36 Correct 3 ms 3164 KB Output is correct
37 Correct 3 ms 3164 KB Output is correct
38 Correct 10 ms 3444 KB Output is correct
39 Correct 10 ms 3420 KB Output is correct
40 Correct 11 ms 3420 KB Output is correct
41 Correct 3 ms 3420 KB Output is correct
42 Correct 3 ms 3420 KB Output is correct
43 Correct 3 ms 3420 KB Output is correct
44 Correct 11 ms 3420 KB Output is correct
45 Correct 11 ms 3164 KB Output is correct
46 Correct 11 ms 3404 KB Output is correct
47 Correct 3 ms 3160 KB Output is correct
48 Correct 3 ms 3164 KB Output is correct
49 Correct 3 ms 3164 KB Output is correct
50 Correct 11 ms 3240 KB Output is correct
51 Correct 10 ms 3164 KB Output is correct
52 Correct 11 ms 3164 KB Output is correct
53 Correct 10 ms 3372 KB Output is correct
54 Correct 10 ms 3368 KB Output is correct
55 Correct 12 ms 3372 KB Output is correct
56 Correct 2 ms 2904 KB Output is correct
57 Correct 2 ms 3164 KB Output is correct
58 Correct 3 ms 3160 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Correct 2 ms 2908 KB Output is correct
4 Correct 2514 ms 20660 KB Output is correct
5 Correct 1767 ms 29728 KB Output is correct
6 Correct 2725 ms 33108 KB Output is correct
7 Correct 4295 ms 37080 KB Output is correct
8 Correct 4181 ms 37216 KB Output is correct
9 Correct 4316 ms 37204 KB Output is correct
10 Correct 4212 ms 37032 KB Output is correct
11 Correct 4466 ms 37080 KB Output is correct
12 Correct 253 ms 36944 KB Output is correct
13 Correct 259 ms 36944 KB Output is correct
14 Correct 262 ms 36948 KB Output is correct
15 Correct 52 ms 33448 KB Output is correct
16 Correct 75 ms 36688 KB Output is correct
17 Correct 59 ms 6136 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 37 ms 15572 KB Output is correct
3 Correct 57 ms 16752 KB Output is correct
4 Correct 60 ms 18464 KB Output is correct
5 Correct 64 ms 25824 KB Output is correct
6 Correct 71 ms 25940 KB Output is correct
7 Correct 79 ms 25940 KB Output is correct
8 Correct 84 ms 26020 KB Output is correct
9 Correct 77 ms 25884 KB Output is correct
10 Correct 74 ms 25940 KB Output is correct
11 Correct 72 ms 26044 KB Output is correct
12 Correct 74 ms 26072 KB Output is correct
13 Correct 82 ms 26196 KB Output is correct
14 Correct 70 ms 26488 KB Output is correct
15 Correct 63 ms 27732 KB Output is correct
16 Correct 74 ms 26196 KB Output is correct
17 Correct 75 ms 26144 KB Output is correct
18 Correct 69 ms 26196 KB Output is correct
19 Correct 57 ms 26044 KB Output is correct
20 Correct 64 ms 25980 KB Output is correct
21 Correct 71 ms 25940 KB Output is correct
22 Correct 77 ms 25940 KB Output is correct
23 Correct 79 ms 25936 KB Output is correct
24 Correct 76 ms 25928 KB Output is correct
25 Correct 80 ms 25944 KB Output is correct
26 Correct 77 ms 25948 KB Output is correct
27 Correct 74 ms 26044 KB Output is correct
28 Correct 74 ms 25940 KB Output is correct
29 Correct 76 ms 25940 KB Output is correct
30 Correct 75 ms 25940 KB Output is correct
31 Correct 81 ms 26168 KB Output is correct
32 Correct 78 ms 26192 KB Output is correct
33 Correct 69 ms 26960 KB Output is correct
34 Correct 65 ms 27732 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 2 ms 2652 KB Output is correct
3 Correct 2 ms 2904 KB Output is correct
4 Correct 2844 ms 17808 KB Output is correct
5 Correct 3010 ms 20532 KB Output is correct
6 Correct 4033 ms 27148 KB Output is correct
7 Correct 4480 ms 30828 KB Output is correct
8 Correct 4500 ms 30804 KB Output is correct
9 Correct 4434 ms 30880 KB Output is correct
10 Correct 4467 ms 30852 KB Output is correct
11 Correct 4487 ms 30800 KB Output is correct
12 Correct 4448 ms 30852 KB Output is correct
13 Correct 4534 ms 30864 KB Output is correct
14 Correct 54 ms 6228 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2648 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Correct 1 ms 2652 KB Output is correct
4 Correct 2 ms 2908 KB Output is correct
5 Correct 2 ms 2908 KB Output is correct
6 Correct 2 ms 2908 KB Output is correct
7 Correct 1 ms 2908 KB Output is correct
8 Correct 2 ms 2908 KB Output is correct
9 Correct 2 ms 2908 KB Output is correct
10 Correct 2 ms 2948 KB Output is correct
11 Correct 2 ms 2908 KB Output is correct
12 Correct 1 ms 2904 KB Output is correct
13 Correct 1 ms 2908 KB Output is correct
14 Correct 1 ms 2908 KB Output is correct
15 Correct 2 ms 2908 KB Output is correct
16 Correct 2 ms 2908 KB Output is correct
17 Correct 2 ms 2956 KB Output is correct
18 Correct 2 ms 2908 KB Output is correct
19 Correct 3 ms 2908 KB Output is correct
20 Correct 3 ms 2908 KB Output is correct
21 Correct 2 ms 2908 KB Output is correct
22 Correct 2 ms 2908 KB Output is correct
23 Correct 2 ms 2908 KB Output is correct
24 Correct 2 ms 2908 KB Output is correct
25 Correct 2 ms 2908 KB Output is correct
26 Correct 2 ms 2908 KB Output is correct
27 Correct 1 ms 2652 KB Output is correct
28 Correct 1 ms 2908 KB Output is correct
29 Correct 1 ms 2908 KB Output is correct
30 Correct 7 ms 3164 KB Output is correct
31 Correct 9 ms 3232 KB Output is correct
32 Correct 10 ms 3360 KB Output is correct
33 Correct 11 ms 3160 KB Output is correct
34 Correct 11 ms 3164 KB Output is correct
35 Correct 3 ms 3164 KB Output is correct
36 Correct 3 ms 3164 KB Output is correct
37 Correct 3 ms 3164 KB Output is correct
38 Correct 10 ms 3444 KB Output is correct
39 Correct 10 ms 3420 KB Output is correct
40 Correct 11 ms 3420 KB Output is correct
41 Correct 3 ms 3420 KB Output is correct
42 Correct 3 ms 3420 KB Output is correct
43 Correct 3 ms 3420 KB Output is correct
44 Correct 11 ms 3420 KB Output is correct
45 Correct 11 ms 3164 KB Output is correct
46 Correct 11 ms 3404 KB Output is correct
47 Correct 3 ms 3160 KB Output is correct
48 Correct 3 ms 3164 KB Output is correct
49 Correct 3 ms 3164 KB Output is correct
50 Correct 11 ms 3240 KB Output is correct
51 Correct 10 ms 3164 KB Output is correct
52 Correct 11 ms 3164 KB Output is correct
53 Correct 10 ms 3372 KB Output is correct
54 Correct 10 ms 3368 KB Output is correct
55 Correct 12 ms 3372 KB Output is correct
56 Correct 2 ms 2904 KB Output is correct
57 Correct 2 ms 3164 KB Output is correct
58 Correct 3 ms 3160 KB Output is correct
59 Correct 1 ms 2652 KB Output is correct
60 Correct 1 ms 2652 KB Output is correct
61 Correct 2 ms 2908 KB Output is correct
62 Correct 2514 ms 20660 KB Output is correct
63 Correct 1767 ms 29728 KB Output is correct
64 Correct 2725 ms 33108 KB Output is correct
65 Correct 4295 ms 37080 KB Output is correct
66 Correct 4181 ms 37216 KB Output is correct
67 Correct 4316 ms 37204 KB Output is correct
68 Correct 4212 ms 37032 KB Output is correct
69 Correct 4466 ms 37080 KB Output is correct
70 Correct 253 ms 36944 KB Output is correct
71 Correct 259 ms 36944 KB Output is correct
72 Correct 262 ms 36948 KB Output is correct
73 Correct 52 ms 33448 KB Output is correct
74 Correct 75 ms 36688 KB Output is correct
75 Correct 59 ms 6136 KB Output is correct
76 Correct 1 ms 2652 KB Output is correct
77 Correct 37 ms 15572 KB Output is correct
78 Correct 57 ms 16752 KB Output is correct
79 Correct 60 ms 18464 KB Output is correct
80 Correct 64 ms 25824 KB Output is correct
81 Correct 71 ms 25940 KB Output is correct
82 Correct 79 ms 25940 KB Output is correct
83 Correct 84 ms 26020 KB Output is correct
84 Correct 77 ms 25884 KB Output is correct
85 Correct 74 ms 25940 KB Output is correct
86 Correct 72 ms 26044 KB Output is correct
87 Correct 74 ms 26072 KB Output is correct
88 Correct 82 ms 26196 KB Output is correct
89 Correct 70 ms 26488 KB Output is correct
90 Correct 63 ms 27732 KB Output is correct
91 Correct 74 ms 26196 KB Output is correct
92 Correct 75 ms 26144 KB Output is correct
93 Correct 69 ms 26196 KB Output is correct
94 Correct 57 ms 26044 KB Output is correct
95 Correct 64 ms 25980 KB Output is correct
96 Correct 71 ms 25940 KB Output is correct
97 Correct 77 ms 25940 KB Output is correct
98 Correct 79 ms 25936 KB Output is correct
99 Correct 76 ms 25928 KB Output is correct
100 Correct 80 ms 25944 KB Output is correct
101 Correct 77 ms 25948 KB Output is correct
102 Correct 74 ms 26044 KB Output is correct
103 Correct 74 ms 25940 KB Output is correct
104 Correct 76 ms 25940 KB Output is correct
105 Correct 75 ms 25940 KB Output is correct
106 Correct 81 ms 26168 KB Output is correct
107 Correct 78 ms 26192 KB Output is correct
108 Correct 69 ms 26960 KB Output is correct
109 Correct 65 ms 27732 KB Output is correct
110 Correct 1 ms 2652 KB Output is correct
111 Correct 2 ms 2652 KB Output is correct
112 Correct 2 ms 2904 KB Output is correct
113 Correct 2844 ms 17808 KB Output is correct
114 Correct 3010 ms 20532 KB Output is correct
115 Correct 4033 ms 27148 KB Output is correct
116 Correct 4480 ms 30828 KB Output is correct
117 Correct 4500 ms 30804 KB Output is correct
118 Correct 4434 ms 30880 KB Output is correct
119 Correct 4467 ms 30852 KB Output is correct
120 Correct 4487 ms 30800 KB Output is correct
121 Correct 4448 ms 30852 KB Output is correct
122 Correct 4534 ms 30864 KB Output is correct
123 Correct 54 ms 6228 KB Output is correct
124 Correct 3789 ms 30800 KB Output is correct
125 Correct 2290 ms 28480 KB Output is correct
126 Correct 4592 ms 30972 KB Output is correct
127 Correct 4682 ms 30980 KB Output is correct
128 Correct 4637 ms 30980 KB Output is correct
129 Correct 4554 ms 30976 KB Output is correct
130 Correct 4633 ms 30984 KB Output is correct
131 Correct 4493 ms 36176 KB Output is correct
132 Correct 4428 ms 37032 KB Output is correct
133 Correct 4446 ms 33872 KB Output is correct
134 Correct 4471 ms 31060 KB Output is correct
135 Correct 4519 ms 31060 KB Output is correct
136 Correct 4539 ms 31000 KB Output is correct
137 Correct 4458 ms 31344 KB Output is correct
138 Correct 4368 ms 31288 KB Output is correct
139 Correct 4559 ms 31284 KB Output is correct
140 Correct 4495 ms 31180 KB Output is correct
141 Correct 4403 ms 31280 KB Output is correct
142 Correct 4452 ms 31284 KB Output is correct
143 Correct 55 ms 27220 KB Output is correct
144 Correct 76 ms 30464 KB Output is correct