답안 #726530

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
726530 2023-04-19T03:48:11 Z amunduzbaev Prize (CEOI22_prize) C++17
0 / 100
815 ms 389412 KB
#include "bits/stdc++.h"
using namespace std;
 
#define ar array
typedef long long ll;
#define int ll

const int N = 5e5 + 5;
vector<int> G[2][N];
int tin[2][N], tout[2][N], par[2][N][20];
vector<int> pos[N];
int P[N];

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int n, k, q, T; cin >> n >> k >> q >> T;
	int R[2] {};
	for(int i=1;i<=n;i++){
		int p; cin >> p;
		if(~p){
			G[0][p].push_back(i);
		} else {
			R[0] = i;
		}
	}
	for(int i=1;i<=n;i++){
		int p; cin >> p;
		if(~p){
			G[1][p].push_back(i);
		} else {
			R[1] = p;
		}
	}
	
	for(int c=0;c<2;c++){
		int t = 0;
		tout[c][0] = N;
		function<void(int)> dfs = [&](int u){
			tin[c][u] = ++t;
			for(int j=1;j<20;j++){
				par[c][u][j] = par[c][par[c][u][j-1]][j-1];
			}
			for(auto x : G[c][u]){
				par[c][x][0] = u;
				dfs(x);
			}
			tout[c][u] = t;
		};
		dfs(R[c]);
	}
	
	vector<int> p;
	for(int i=1;i<=k;i++){
		cout<<i<<" ";
		p.push_back(i);
	} 
	cout<<endl;
	auto is = [&](int t, int a, int b){
		return (tin[t][a] <= tin[t][b] && tin[t][b] <= tout[t][a]);
	};
	
	auto Lca = [&](int t, int a, int b){
		if(is(t, a, b)) return a;
		if(is(t, b, a)) return b;
		for(int j=19;~j;j--){
			if(!is(t, par[t][a][j], b)) a = par[t][a][j];
		}
		return par[t][a][0];
	};
	
	if(q == k - 1){
		sort(p.begin(), p.end(), [&](int a, int b){
			return tin[0][a] < tin[0][b];
		});
		for(int i=0;i<k;i++){
			P[p[i]] = i;
		}
		for(int i=1;i<k;i++){
			cout<<"? "<<p[i-1]<<" "<<p[i]<<endl;
		}
		vector<ar<int, 2>> ed;
		cout<<"! "<<endl;
		
		for(int i=1;i<k;i++){
			int da, db; cin >> da >> db >> da >> db;
			int lca = Lca(0, p[i-1], p[i]);
			pos[lca].push_back(i - 1);
			ed.push_back({da, db});
		}
		int sz = ed.size();
		vector<int> pref(sz);
		for(int i=0;i<sz;i++){
			if(i){
				pref[i] = pref[i-1];
			}
			pref[i] += (ed[i][0] - ed[i][1]);
		}
		
		for(int i=0;i<T;i++){
			int a, b; cin >> a >> b;
			if(tin[0][a] > tin[0][b]) swap(a, b);
			int lca = Lca(0, a, b);
			int l = P[a], r = P[b];
			assert(!pos[lca].empty());
			assert(pos[lca].back() <= l);
			int j = *lower_bound(pos[lca].begin(), pos[lca].end(), l);
			assert(j < r);
			int res = (j ? pref[j - 1] : 0) - (l ? pref[l - 1] : 0) + ed[j][0] + ed[j][1] - (pref[r - 1] - pref[j]);
			cout<<res<<" "<<res<<"\n";
		}
	}
	
	//~ for(int c=0;c<1 + (q == 2 * k - 2);c++){
		//~ for(int i=1;i<k;i++){
			//~ cout<<"? "<<p[i-1]<<" "<<p[i]<<"\n";
		//~ }
	//~ }
}

/*

9 3 2 3
2 -1 2 1 1 5 1 4 5
2 -1 2 1 1 5 1 4 5
3 0 3 0
3 1 3 1
1 2
2 3
1 3

*/
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 732 ms 196812 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 740 ms 193304 KB Unexpected end of file - token expected
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 815 ms 389412 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 294 ms 135420 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 284 ms 135372 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -