제출 #636950

#제출 시각아이디문제언어결과실행 시간메모리
636950BinaryboyBitaro’s Party (JOI18_bitaro)C++14
100 / 100
1810 ms258720 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXn = 1e5 + 10, SQ =300 + 10;
typedef pair<int, int> pii;
vector<int> g[MAXn], revg[MAXn];
int n, m, q;
pii dp[MAXn][SQ];
int dp_not_coming[MAXn];
bool in_dp[MAXn];
bool not_coming[MAXn];
inline void makeDp() {
	for (int i = 0; i < n; i++) {
		vector<pii> p_update;
		p_update.push_back(pii(0, i));
		for (int u : revg[i]) {
			vector<pii> to_be_merged;
			int z = 0, j = 0;
			while(z < p_update.size() && (j < SQ && dp[u][j].first != -1)) {
				if (p_update[z].first >= dp[u][j].first + 1)  {
					to_be_merged.push_back(p_update[z]);
					z++;
				}
				else {
					to_be_merged.push_back(pii(dp[u][j].first + 1, dp[u][j].second));
					j++;
				}	
			}
			while(j < SQ && dp[u][j].first != -1) {
				to_be_merged.push_back(pii(dp[u][j].first + 1, dp[u][j].second));
				j++;
			}
			while(z < p_update.size()) {
				to_be_merged.push_back(p_update[z]);
				z++;
			}
		
			p_update.clear();
			for (pii val : to_be_merged)
				if (!in_dp[val.second]) {
					p_update.push_back(val);
					in_dp[val.second] = true;
				}
			for (pii val : p_update) {
				in_dp[val.second] = false;
			}
			if (p_update.size() > SQ)
				p_update.resize(SQ);
		}
		int ind = 0, j = 0;
		while(j < p_update.size() && ind < SQ) {
			dp[i][ind++] = p_update[j];
			j++;
		}
	}
}




inline int get_ans_not_coming(int party_v) {
	for (int i = 0; i <= party_v; i++) {
		if (!not_coming[i]) {
			dp_not_coming[i] = 0;
		}
		else {
			dp_not_coming[i] = -1;
		}
		for (int u : revg[i]) {
			if (dp_not_coming[u] != -1) {
				dp_not_coming[i] = max(dp_not_coming[u] + 1, dp_not_coming[i]);
			}
		}
	}
	return dp_not_coming[party_v];
}


int main() {
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin >> n >> m >> q;
	for (int i = 0; i < m; i++) {
		int u, v;
		cin >> u >> v;u--;v--;
		g[u].push_back(v);
		revg[v].push_back(u);
	}
	for (int i = 0; i < MAXn; i++)
		for (int j = 0; j < SQ; j++)
			dp[i][j] = pii(-1,-1);
	makeDp();
	while(q--) {
		int party_v, cnt_not_coming;
		cin >> party_v >> cnt_not_coming;
		party_v--;
		vector<int> not_coming_query;
		for (int i = 0; i < cnt_not_coming; i++) {
			int v;
			cin >> v;
			v--;
			not_coming_query.push_back(v);
			not_coming[v] = true;
		}
		if (cnt_not_coming < SQ - 1) {
			for (int i = 0; i < SQ; i++)
				if(!not_coming[dp[party_v][i].second]) {
					cout << dp[party_v][i].first << '\n';
					break;
				}
		}
		else {
			cout << get_ans_not_coming(party_v) << '\n';
		}
		
		for (int v : not_coming_query) {
			not_coming[v] = false;
		}
	}
}

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

bitaro.cpp: In function 'void makeDp()':
bitaro.cpp:18:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |    while(z < p_update.size() && (j < SQ && dp[u][j].first != -1)) {
      |          ~~^~~~~~~~~~~~~~~~~
bitaro.cpp:32:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |    while(z < p_update.size()) {
      |          ~~^~~~~~~~~~~~~~~~~
bitaro.cpp:50:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |   while(j < p_update.size() && ind < SQ) {
      |         ~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...