제출 #1274213

#제출 시각아이디문제언어결과실행 시간메모리
1274213nthvnBitaro’s Party (JOI18_bitaro)C++20
100 / 100
1282 ms171628 KiB
#include "bits/stdc++.h"
using namespace std;

#define LOG(n) (63 - __builtin_clzll((n)))
#define fi first
#define se second
#define pii pair<int,int> 
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define pb push_back
#define ll long long
const int N = 2e5+5;
const int S = 100;
int n,m,q;
vector<int> g[N];
pii f[N][S+5];
int dp[N];
bool ban[N];

void mg(pii a[], pii b[]){
	static pii t[2*S+5];
	
	int l = 1, r=1;
	int st=0;
	while(l<=S&&r<=S){
		if(a[l].fi>b[r].fi+1){
			t[++st] = a[l++];
		}
		else t[++st] = {b[r].fi+1, b[r].se}, r++;
	}
	while(l<=S){
		t[++st] = a[l++];
	}
	while(r<=S){
		t[++st] = {b[r].fi+1, b[r].se};
		r++;
	}
	unordered_set<int> uni;
	for(int i=1, pt =0;i<= st;i++){
		if(uni.count(t[i].se)) continue;
		uni.insert(t[i].se);
		a[++pt] = t[i];
		if(pt==S) break;
	}
}

void preprocess(){
	fill_n(&f[0][0],sizeof(f)/sizeof(f[0][0]), make_pair(-1e9,-1));
	for(int u=1;u<=n;u++) f[u][1] = {0,u};
	for(int u=1;u<=n;u++){
		for(auto &v: g[u]){
			mg(f[v], f[u]);
		}
	}
	
	// for(int i=1;i<=5;i++) cerr<<f[2][i].fi<<" "<<f[2][i].se<<"\n";
}


signed main(){
	ios_base::sync_with_stdio(NULL);
	cin.tie(NULL);
	if(fopen("TASK.INP", "r")){
		freopen("TASK.INP", "r", stdin);
		freopen("TASK.OUT", "w", stdout);
	}
	cin>>n>>m>>q;
	for(int i=1;i<=m;i++){
		int u,v; cin>>u>>v;
		g[u].pb(v);
	}
	preprocess();
	while(q--){
		int t,y; cin>>t>>y;
		static int qr[N];
		for(int i=1;i<=y;i++){
			cin>>qr[i]; ban[qr[i]] = true;
		}
		if(y>=S){
			memset(dp,-1,sizeof(dp));
			dp[t]= 0;
			int ans = ban[t]? -1: 0;
			for(int i=t-1;i>=1;i--){
				for(auto &v: g[i]){
					if(dp[v]==-1) continue;
					dp[i] = max(dp[i], dp[v]+1);
				}
				if(dp[i]!=-1){
					if(!ban[i]) ans = max(ans, dp[i]);
				}
			}
			cout<<ans<<"\n";
		}
		else{
			bool flag = false;
			for(int i=1;i<=S;i++){
				if(f[t][i].se==-1) break;
				if(!ban[f[t][i].se]) {
					cout<<f[t][i].fi<<"\n";
					flag = true;
					break;
				}
			}
			if(!flag) cout<<-1<<"\n";
		}
		
		for(int i=1;i<=y;i++) ban[qr[i]] = false;
	}
	
}

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

bitaro.cpp: In function 'int main()':
bitaro.cpp:64:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |                 freopen("TASK.INP", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:65:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   65 |                 freopen("TASK.OUT", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...