제출 #1324267

#제출 시각아이디문제언어결과실행 시간메모리
1324267sonarchtTourism (JOI23_tourism)C++20
100 / 100
553 ms46408 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ld long double
#define pb push_back
#define all(v) begin(v), end(v)
#define pll pair<ll, ll>
#define fi first
#define se second
#define vll vector<ll>
#define mll map<ll, ll>
mt19937_64 rng(chrono::high_resolution_clock().now().time_since_epoch().count());
const ll N = 1e5 + 6, inf = 1e18 + 7, mod = 1e9 + 7, B = 310;
ll n, m, k, q, ans[N], mp[N], c[N], res = 0;

vll adj[N];
vector<pll> v[N];
ll sz[N], dep[N], par[N], hvy[N], timer = 0, tin[N], tout[N], tour[N], head[N];
void dfs(ll p, ll u) {
	sz[u] = 1;
	for (ll v : adj[u]) {
		if (v == p) continue;
		par[v] = u;
		dep[v] = dep[u] + 1;
		dfs(u, v);
		sz[u] += sz[v];
		if (sz[v] > sz[hvy[u]]) hvy[u] = v;
	}
}

void hld(ll p, ll u, ll hd) {
	head[u] = hd;
	tin[u] = ++timer;
	tour[timer] = u;
	if (hvy[u]) hld(u, hvy[u], hd);
	for (ll v : adj[u]) {
		if (v != p && v != hvy[u]) hld(u, v, v);
	}
	tout[u] = timer;
}

ll st[N*4];
void update(ll id, ll l, ll r, ll x, ll val) {
	if (l > x || r < x) return;
	if (l == r) {
		st[id] += val;
		return;
	} 
	ll mid = (l+r) / 2;
	update(id*2, l, mid, x, val);
	update(id*2+1, mid+1, r, x, val);
	st[id] = st[id*2] + st[id*2+1];
}

ll get(ll id, ll l, ll r, ll u, ll v) {
	if (l > v || r < u) return 0;
	if (u <= l && r <= v) return st[id];
	ll mid = (l+r) / 2;
	return get(id*2, l, mid, u, v) + get(id*2+1, mid+1, r, u, v);
}

ll lca(ll u, ll v) {
	while (head[u] != head[v]) {
		if (dep[head[u]] > dep[head[v]]) u = par[head[u]];
		else v = par[head[v]];
	}
	return (dep[u] < dep[v] ? u : v);
}

ll sp[N][21], lg[N];
void build() {
	for (int i = 1; i <= m; ++i) {
		sp[i][0] = c[i];
		lg[i] = __lg(i);
	}
	for (int j = 1; (1 << j) <= m; ++j) {
		for (int i = 1; i + (1 << (j-1)) <= m; ++i) {
			sp[i][j] = lca(sp[i][j-1], sp[i + (1 << (j-1))][j-1]);
		}
	}
}

ll lca_range(ll l, ll r) {
	ll t = lg[r-l+1];
	//cout << "l r t " << l << " " << r << " " << t << endl;
	return lca(sp[l][t], sp[r - (1 << t) + 1][t]);
}

vector<pll> stk[N];
void add(ll i) {
	ll u = c[i];
	while (true) {
		ll temp1 = dep[u] - dep[head[u]] + 1, temp2 = 0;
		auto &st = stk[head[u]];
		while (!st.empty()) {
			auto [y, cy] = st.back();
			temp2 += cy;
			if (temp2 <= temp1) {
				update(1, 1, m, y, -cy);
				st.pop_back();
			}
			else {
				update(1, 1, m, y, -cy);
				update(1, 1, m, y, temp2-temp1);
				st.back().se = temp2-temp1;
				break;
			}
		}
		st.pb({i, temp1});
		update(1, 1, m, i, temp1);
		if (head[u] == 1) break;
		u = par[head[u]];
	}
}

void solve() {
	cin >> n >> m >> q;
	for (int i = 1; i < n; ++i) {
		ll x, y;
		cin >> x >> y;
		adj[x].pb(y);
		adj[y].pb(x);
	}
	dep[1] = 1;
	dfs(-1, 1);
	hld(-1, 1, 1);
	for (int i = 1; i <= m; ++i) cin >> c[i];
	build();
	for (int i = 1; i <= q; ++i) {
		ll l, r;
		cin >> l >> r;
		v[r].pb({l, i});
	}
	for (int r = 1; r <= m; ++r) {
		add(r);
		for (auto [l, idx] : v[r]) {
			ll p = lca_range(l, r);
			ans[idx] = get(1, 1, m, l, r) - dep[p] + 1;
		}
		// for (int i = 1; i <= r; ++i) cout << get(1, 1, m, i, i) << " ";
		// cout << endl;
	}
	for (int i = 1; i <= q; ++i) cout << ans[i] << endl;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	if (fopen(".INP", "r")) {
		freopen(".INP", "r", stdin);
		freopen(".OUT", "w", stdout);
	}
	ll tc = 1;
//	cin >> tc;
	while (tc--) {
		solve();
	}
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

tourism.cpp: In function 'int main()':
tourism.cpp:152:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  152 |                 freopen(".INP", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~
tourism.cpp:153:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  153 |                 freopen(".OUT", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...