Submission #927083

# Submission time Handle Problem Language Result Execution time Memory
927083 2024-02-14T08:45:33 Z socpite 한자 끝말잇기 (JOI14_kanji) C++14
98 / 100
124 ms 14592 KB
#include "Annalib.h"
#include<bits/stdc++.h>
using namespace std;

const long long INF = LLONG_MAX/2;
const int maxn = 305;

namespace anna{
  	vector<pair<int, int>> g[maxn];

	vector<long long> shortest_path(int N, int s, long long C[]){
		vector<long long> d(N, INF);
		vector<int> vis(N, 0);
		d[s] = 0;
		for(int i = 1; i <= N; i++){
			long long best = INF;
			int x = -1;
			for(int j = 0; j < N; j++){
				if(vis[j])continue;
				if(d[j] < best){
					best = d[j];
					x = j;
				}
			}
			if(x == -1)break;
			vis[x] = 1;
			for(auto v: g[x]) if(d[v.first] > C[v.second] + best)d[v.first] = C[v.second] + best;
		}
		return d;
	}

	

	void solve(int K, int Q, vector<long long>& forgor_C, vector<vector<long long>>& cost_to_T){
		// eval(i, x) = forgor(x) + cost_to_T
		vector<vector<int>> queries(K+1);
		for(int i = 0; i < Q; i++)queries[0].push_back(i);
		for(int b = 1; b <= K; b++){
			long long total_case = 1, crr = 0;
			for(int a = 0; a < b; a++){
				vector<int> a_wins;
				for(auto v: queries[a]){
					if(forgor_C[a] + cost_to_T[a][v] < forgor_C[b] + cost_to_T[b][v])a_wins.push_back(v);
					else queries[b].push_back(v);
				}
				int cases = queries[a].size() + 1, num = a_wins.size();
				total_case *= cases;
				crr*=cases;
				crr += num;
				queries[a] = a_wins;
			}
			while(total_case > 1){
				Tap(crr&1);
				total_case = (total_case+1)>>1;
				crr>>=1;
			}
		}
	}
}


void Anna(int N, int M, int A[], int B[], long long C[], int Q, int S[], int T[], int K, int U[]) {
	vector<long long> forgor_C(K+1, 0);
	vector<vector<long long>> cost_to_T(K+1, vector<long long>(Q));
	for(int i = 0; i < K; i++){
		forgor_C[i] = C[U[i]];
	}	
	for(int i = 0; i < K; i++)C[U[i]] = INF;
	for(int i = 0; i < M; i++){
		anna::g[A[i]].push_back({B[i], i});
	}
	for(int i = 0; i < K; i++){
		auto d = anna::shortest_path(N, B[U[i]], C);
		for(int j = 0; j < Q; j++)cost_to_T[i][j] = d[T[j]];
	}
	for(int i = 0; i < Q; i++){
		auto d = anna::shortest_path(N, S[i], C);
		for(int j = 0; j < K; j++)cost_to_T[j][i] += d[A[U[j]]];
		cost_to_T[K][i] = d[T[i]];
	}
	anna::solve(K, Q, forgor_C, cost_to_T);
	// eval(i, x) = forgor(x) + cost_to_A + cost_to_T



}
#include "Brunolib.h"
#include<bits/stdc++.h>
using namespace std;


const int maxn = 305;
const long long INF = 1e16*maxn;

namespace bruno {
  	vector<pair<int, int>> g[maxn];

	vector<long long> shortest_path(int N, int s, long long C[]){
		vector<long long> d(N, INF);
		vector<int> vis(N, 0);
		d[s] = 0;
		for(int i = 1; i <= N; i++){
			long long best = INF;
			int x = -1;
			for(int j = 0; j < N; j++){
				if(vis[j])continue;
				if(d[j] < best){
					best = d[j];
					x = j;
				}
			}
			if(x == -1)break;
			vis[x] = 1;
			for(auto v: g[x]) if(d[v.first] > C[v.second] + best)d[v.first] = C[v.second] + best;
		}
		return d;
	}

	vector<int> path[60];

	vector<int> solve_query(int N, int s, int t, long long C[]){
		vector<long long> d(N, INF);
		vector<int> vis(N, 0);
		vector<pair<int, int>> trace(N);
		d[s] = 0;
		for(int i = 1; i <= N; i++){
			long long best = INF;
			int x = -1;
			for(int j = 0; j < N; j++){
				if(vis[j])continue;
				if(d[j] < best){
					best = d[j];
					x = j;
				}
			}
			if(x == -1)break;
			vis[x] = 1;
			for(auto v: g[x]) if(d[v.first] > C[v.second] + best){
				d[v.first] = C[v.second] + best;
				trace[v.first] = {x, v.second};
			}
		}
		vector<int> ans;
		while(t != s){
			ans.push_back(trace[t].second);
			t = trace[t].first;
		}
		reverse(ans.begin(), ans.end());
		return ans;
	}

	vector<vector<int>> solve(int K, int Q, vector<vector<long long>>& cost_to_T, int &ptr, int X[]){
		vector<vector<int>> queries(K+1);
		for(int i = 0; i < Q; i++)queries[0].push_back(i);
		for(int b = 1; b <= K; b++){
			long long total_case = 1, crr = 0;
			for(int a = 0; a < b; a++)total_case*=(queries[a].size()+1);
			for(int i = 0; total_case > 1; i++){
				crr ^= X[ptr++]<<i;
				total_case = (total_case+1)>>1;
			}
			for(int a = b-1; a >= 0; a--){
				auto cmp = [&a, &b, &cost_to_T](int lhs, int rhs){
					return cost_to_T[a][lhs] - cost_to_T[b][lhs] < cost_to_T[a][rhs] - cost_to_T[b][rhs];  
				};

				int cases = queries[a].size() + 1;
				sort(queries[a].begin(), queries[a].end(), cmp);
				while(queries[a].size() > crr%cases){
					queries[b].push_back(queries[a].back());
					queries[a].pop_back();
				}
				crr/=cases;
			}
		}
		return queries;
	}
}

void Bruno(int N, int M, int A[], int B[], long long C[], int Q, int S[], int T[], int K, int U[], int L, int X[]) {
	vector<vector<long long>> cost_to_T(K+1, vector<long long>(Q));
	for(int i = 0; i < K; i++)C[U[i]] = INF;
	for(int i = 0; i < M; i++){
		bruno::g[A[i]].push_back({B[i], i});
	}
	for(int i = 0; i < K; i++){
		auto d = bruno::shortest_path(N, B[U[i]], C);
		for(int j = 0; j < Q; j++)cost_to_T[i][j] = d[T[j]];
	}
	for(int i = 0; i < Q; i++){
		auto d = bruno::shortest_path(N, S[i], C);
		for(int j = 0; j < K; j++)cost_to_T[j][i] += d[A[U[j]]];
		cost_to_T[K][i] = d[T[i]];
	};
	int ptr = 0;
	auto qtypes = bruno::solve(K, Q, cost_to_T, ptr, X);
	for(int i = 0; i <= K; i++){
		if(i < K)C[U[i]] = 0;
		for(auto v: qtypes[i]){
			bruno::path[v] = bruno::solve_query(N, S[v], T[v], C);
			if(i == K)for(auto ele: bruno::path[v]){
				for(int j = 0; j < K; j++)assert(ele != U[j]);
			}
		}
		if(i < K)C[U[i]] = INF;
	}
	for(int i = 0; i < Q; i++){
		for(auto v: bruno::path[i])Answer(v);
		Answer(-1);
	}
}

Compilation message

Bruno.cpp: In function 'std::vector<std::vector<int> > bruno::solve(int, int, std::vector<std::vector<long long int> >&, int&, int*)':
Bruno.cpp:83:29: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   83 |     while(queries[a].size() > crr%cases){
      |           ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 9 ms 4396 KB Output is correct - L = 28
2 Correct 9 ms 4400 KB Output is correct - L = 23
3 Correct 7 ms 4400 KB Output is correct - L = 26
4 Correct 7 ms 4392 KB Output is correct - L = 27
5 Correct 9 ms 4640 KB Output is correct - L = 27
6 Correct 8 ms 4392 KB Output is correct - L = 27
7 Correct 9 ms 4380 KB Output is correct - L = 30
8 Correct 9 ms 4408 KB Output is correct - L = 20
9 Correct 9 ms 4624 KB Output is correct - L = 20
10 Correct 11 ms 4732 KB Output is correct - L = 20
11 Correct 4 ms 4388 KB Output is correct - L = 5
12 Correct 76 ms 14216 KB Output is correct - L = 20
13 Correct 6 ms 4392 KB Output is correct - L = 31
14 Correct 3 ms 4396 KB Output is correct - L = 1
# Verdict Execution time Memory Grader output
1 Correct 23 ms 4900 KB Output is correct - L = 64
2 Correct 27 ms 4612 KB Output is correct - L = 64
3 Correct 25 ms 4908 KB Output is correct - L = 53
4 Correct 28 ms 4900 KB Output is correct - L = 56
5 Correct 23 ms 4392 KB Output is correct - L = 63
6 Correct 28 ms 5152 KB Output is correct - L = 63
7 Correct 25 ms 4912 KB Output is correct - L = 45
8 Correct 27 ms 4944 KB Output is correct - L = 63
9 Correct 10 ms 4904 KB Output is correct - L = 65
10 Correct 12 ms 4912 KB Output is correct - L = 65
11 Correct 10 ms 4924 KB Output is correct - L = 65
12 Correct 28 ms 4908 KB Output is correct - L = 62
13 Correct 122 ms 14592 KB Output is correct - L = 33
14 Correct 28 ms 4924 KB Output is correct - L = 63
15 Correct 27 ms 4904 KB Output is correct - L = 53
16 Correct 33 ms 4908 KB Output is correct - L = 34
17 Correct 34 ms 4984 KB Output is correct - L = 42
18 Correct 37 ms 5328 KB Output is correct - L = 46
19 Correct 13 ms 4400 KB Output is correct - L = 42
20 Correct 30 ms 5900 KB Output is correct - L = 57
21 Correct 40 ms 6088 KB Output is correct - L = 30
22 Correct 10 ms 4912 KB Output is correct - L = 65
23 Correct 11 ms 4912 KB Output is correct - L = 65
24 Correct 10 ms 4920 KB Output is correct - L = 65
# Verdict Execution time Memory Grader output
1 Correct 24 ms 5152 KB Output is correct - L = 64
2 Correct 28 ms 4396 KB Output is correct - L = 64
3 Correct 25 ms 4900 KB Output is correct - L = 53
4 Correct 27 ms 4908 KB Output is correct - L = 56
5 Correct 25 ms 4396 KB Output is correct - L = 63
6 Correct 27 ms 4904 KB Output is correct - L = 63
7 Correct 25 ms 4904 KB Output is correct - L = 45
8 Correct 33 ms 4944 KB Output is correct - L = 63
9 Correct 10 ms 4920 KB Output is correct - L = 65
10 Correct 10 ms 4984 KB Output is correct - L = 65
11 Correct 10 ms 4920 KB Output is correct - L = 65
12 Correct 27 ms 4912 KB Output is correct - L = 62
13 Correct 122 ms 14380 KB Output is correct - L = 33
14 Correct 31 ms 4904 KB Output is correct - L = 63
15 Correct 27 ms 4904 KB Output is correct - L = 53
16 Correct 33 ms 4936 KB Output is correct - L = 34
17 Correct 34 ms 4984 KB Output is correct - L = 42
18 Correct 38 ms 5188 KB Output is correct - L = 46
19 Correct 12 ms 4400 KB Output is correct - L = 42
20 Correct 30 ms 5912 KB Output is correct - L = 57
21 Correct 44 ms 5908 KB Output is correct - L = 30
22 Correct 10 ms 4912 KB Output is correct - L = 65
23 Correct 10 ms 4920 KB Output is correct - L = 65
24 Correct 12 ms 4980 KB Output is correct - L = 65
# Verdict Execution time Memory Grader output
1 Correct 21 ms 4924 KB Output is correct - L = 64
2 Correct 27 ms 4596 KB Output is correct - L = 64
3 Correct 26 ms 4912 KB Output is correct - L = 53
4 Correct 27 ms 4908 KB Output is correct - L = 56
5 Correct 25 ms 4656 KB Output is correct - L = 63
6 Correct 28 ms 4908 KB Output is correct - L = 63
7 Correct 25 ms 4912 KB Output is correct - L = 45
8 Correct 28 ms 4896 KB Output is correct - L = 63
9 Correct 10 ms 4920 KB Output is correct - L = 65
10 Correct 12 ms 4920 KB Output is correct - L = 65
11 Correct 10 ms 4980 KB Output is correct - L = 65
12 Correct 28 ms 4944 KB Output is correct - L = 62
13 Correct 124 ms 14436 KB Output is correct - L = 33
14 Correct 28 ms 4900 KB Output is correct - L = 63
15 Correct 27 ms 4908 KB Output is correct - L = 53
16 Correct 33 ms 4992 KB Output is correct - L = 34
17 Correct 34 ms 4984 KB Output is correct - L = 42
18 Correct 38 ms 5316 KB Output is correct - L = 46
19 Correct 12 ms 4392 KB Output is correct - L = 42
20 Correct 29 ms 5900 KB Output is correct - L = 57
21 Correct 41 ms 5908 KB Output is correct - L = 30
22 Correct 12 ms 4972 KB Output is correct - L = 65
23 Correct 10 ms 4908 KB Output is correct - L = 65
24 Correct 11 ms 4912 KB Output is correct - L = 65
# Verdict Execution time Memory Grader output
1 Correct 22 ms 4900 KB Output is correct - L = 64
2 Correct 27 ms 4616 KB Output is correct - L = 64
3 Correct 25 ms 4904 KB Output is correct - L = 53
4 Correct 30 ms 5056 KB Output is correct - L = 56
5 Correct 23 ms 4388 KB Output is correct - L = 63
6 Correct 27 ms 4904 KB Output is correct - L = 63
7 Correct 25 ms 4904 KB Output is correct - L = 45
8 Correct 27 ms 4912 KB Output is correct - L = 63
9 Correct 10 ms 5164 KB Output is partially correct - L = 65
10 Correct 10 ms 4908 KB Output is partially correct - L = 65
11 Correct 10 ms 4912 KB Output is partially correct - L = 65
12 Correct 28 ms 4952 KB Output is correct - L = 62
13 Correct 118 ms 14376 KB Output is correct - L = 33
14 Correct 27 ms 4904 KB Output is correct - L = 63
15 Correct 27 ms 4928 KB Output is correct - L = 53
16 Correct 33 ms 4996 KB Output is correct - L = 34
17 Correct 34 ms 4984 KB Output is correct - L = 42
18 Correct 38 ms 5336 KB Output is correct - L = 46
19 Correct 16 ms 4528 KB Output is correct - L = 42
20 Correct 42 ms 5892 KB Output is correct - L = 57
21 Correct 41 ms 5904 KB Output is correct - L = 30
22 Correct 10 ms 4920 KB Output is partially correct - L = 65
23 Correct 10 ms 4912 KB Output is partially correct - L = 65
24 Correct 10 ms 4912 KB Output is partially correct - L = 65