제출 #164035

#제출 시각아이디문제언어결과실행 시간메모리
164035oolimryBitaro’s Party (JOI18_bitaro)C++14
0 / 100
2082 ms371508 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
typedef pair<int,int> ii;
typedef vector<int> vi;
 
struct query{
	int id;
	unordered_set<int> cannot;
};
static set<ii, greater<ii> > dp[100005];
static unordered_map<int,int> mm;
static int offset[100005]; ///dp[i] + offset[i] = actual value
static vi adj[100005];
static int answer[100005];
static vector<query> queries[100005];
int main(){
	//freopen("i.txt","r",stdin);
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	
	
	int n, m, q;
	cin >> n >> m >> q;
	
	for(int i = 0;i < m;i++){
		int a, b;
		cin >> a >> b;
		a--;
		b--;
		adj[b].push_back(a);
	}
	
	for(int qq = 0;qq < q;qq++){
		int y, t;
		cin >> y >> t;
		y--;
		query nQ;
		nQ.id = qq;
		for(int i = 0;i < t;i++){
			int x;
			cin >> x;
			x--;
			nQ.cannot.insert(x);
		}
		queries[y].push_back(nQ);
	}
	
	for(int u = 0;u < n;u++){
		dp[u].insert(ii(0-offset[u],u));
		mm[u] = 0;
		for(int v : adj[u]){
			bool isSwap = false;
			vector<ii> ori;
			int orioff = 0;
			if(dp[u].size() < dp[v].size()){
				isSwap = true;
				for(ii x : dp[v]){
					ori.push_back(ii(x.first,x.second));
				}
				orioff = offset[v];
			}
			
			if(dp[u].size() < dp[v].size()){
				isSwap = true;
				swap(dp[u],dp[v]);
				swap(offset[u],offset[v]);
				offset[u]++;
				offset[v]--;
			}
			
			for(ii x : dp[v]){
				long long value = x.first+1+offset[v]; 
				if(mm.find(x.second) != mm.end()){
					//if(mm[x.second] < value){
						dp[u].insert(ii(value-offset[u],x.second));
						//dp[u].erase(dp[u].find(ii(mm[x.second]-offset[u],x.second)));
						//mm[x.second] = value;
					//}
				}
				else{
					//mm[x.second] = value;
					dp[u].insert(ii(value-offset[u],x.second));
				}
			}
			if(isSwap){
				dp[v].clear();
				for(ii x : ori) dp[v].insert(x);
				offset[v] = orioff;
			}
		}
		mm.clear();
		for(query qq : queries[u]){
			bool can = false;
			for(ii x : dp[u]){
				if(qq.cannot.find(x.second) == qq.cannot.end()){
					answer[qq.id] = x.first + offset[u];
					can = true;
					break;
				}
			}
			if(!can) answer[qq.id] = -1;
		}
		/*
		for(ii x : dp[u]){
			cout << "(" << x.first + offset[u] << ", " << x.second << ") ";
		}
		cout << offset[u] << "\n";
		//*/
	}
	
	for(int i = 0;i < q;i++){
		cout << answer[i] << "\n";
	}
	
	
	
	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...