Submission #703632

#TimeUsernameProblemLanguageResultExecution timeMemory
703632kinopeFrom Hacks to Snitches (BOI21_watchmen)C++14
15 / 100
6059 ms291572 KiB
#include <bits/stdc++.h>
#define ff first
#define ss second
using namespace std;
typedef pair<int, int> pii;
struct info{
		int x, k, mod;
		info(){}
		info(int x, int k, int mod) : x(x), k(k), mod(mod) {}
};void get(int &a){
		char c = getchar_unlocked(); a = 0;
		while(c<'0'||'9'<c) c = getchar_unlocked();
		while('0'<=c&&c<='9') a = (a<<3)+(a<<1)+c-'0', c = getchar_unlocked();
}
int main(){
		int n, m, a, b; get(n), get(m);
		vector<vector<int>> g(n+1);
		for(int i = 0; i < m; ++i) get(a), get(b), g[a].emplace_back(b), g[b].emplace_back(a);
		int k; get(k);
		vector<pii> ktcykl(n+1);
		vector<int> sz(k+1); sz[0] = 1;
		vector<vector<vector<int>>> dp(n+1);
		for(int i = 1; i <= n; ++i) dp[i].resize(k+1);
		for(int i = 1; i <= n; ++i) dp[i][0].emplace_back(2e09);
		for(int i = 1; i <= k; ++i){
				get(b), sz[i] = b;
				for(int j = 1; j <= n; ++j) dp[j][i].resize(b, 2e09);
				for(int j = 0; j < b; ++j) get(a), ktcykl[a] = pii(i, j);
		}
		queue<info> q;
		for(int i = 0; i <= k; ++i) q.emplace(1, i, 0), dp[1][i][0] = 0;
		while(!q.empty()){
				info x = q.front(); q.pop();
				int odl = dp[x.x][x.k][x.mod];
				//printf("%d %d %d: %d\n", x.x, x.k, x.mod, dp[x.x][x.k][x.mod]);
				if(!ktcykl[x.x].ff){
						for(int u : g[x.x]){
								//printf("%d %d\n", x.x, u);
								if(!ktcykl[u].ff) for(int i = 0; i <= k; ++i){ if(dp[u][i][(odl+1)%sz[i]] > odl+1) q.emplace(u, i, (odl+1)%sz[i]), dp[u][i][(odl+1)%sz[i]] = odl+1;}
								else if(ktcykl[u].ss != (odl+1)%sz[ktcykl[u].ff]) for(int i = 0; i <= k; ++i) if(dp[u][i][(odl+1)%sz[i]] > odl+1) q.emplace(u, i, (odl+1)%sz[i]), dp[u][i][(odl+1)%sz[i]] = odl+1;
						}
						if(dp[x.x][x.k][(x.mod+1)%sz[x.k]] > odl+1) q.emplace(x.x, x.k, (x.mod+1)%sz[x.k]), dp[x.x][x.k][(x.mod+1)%sz[x.k]] = odl+1;
				}
				else{
						for(int u : g[x.x]){
								if(ktcykl[x.x].ff != ktcykl[u].ff){
										if(!ktcykl[u].ff) for(int i = 0; i <= k; ++i){ if(dp[u][i][(odl+1)%sz[i]] > odl+1) q.emplace(u, i, (odl+1)%sz[i]), dp[u][i][(odl+1)%sz[i]] = odl+1;}
										else if(ktcykl[u].ss != (odl+1)%sz[ktcykl[u].ff]) for(int i = 0; i <= k; ++i) if(dp[u][i][(odl+1)%sz[i]] > odl+1) q.emplace(u, i, (odl+1)%sz[i]), dp[u][i][(odl+1)%sz[i]] = odl+1;
								}
								else{
										if(ktcykl[u].ss == (odl+1)%sz[ktcykl[u].ff] || (ktcykl[x.x].ss == (odl+1)%sz[ktcykl[u].ff] && ktcykl[u].ss == odl%sz[ktcykl[u].ff])){/*printf("!!%d %d %d: %d   %d %d\n", x.x, x.k, x.mod, u, ktcykl[x.x].ss, ktcykl[u].ss); */continue;}
										else for(int i = 0; i <= k; ++i) if(dp[u][i][(odl+1)%sz[i]] > odl+1) q.emplace(u, i, (odl+1)%sz[i]), dp[u][i][(odl+1)%sz[i]] = odl+1;
								}
						}
						if(ktcykl[x.x].ss != (odl+1)%sz[ktcykl[x.x].ff] && dp[x.x][x.k][(x.mod+1)%sz[x.k]] > odl+1) q.emplace(x.x, x.k, (x.mod+1)%sz[x.k]), dp[x.x][x.k][(x.mod+1)%sz[x.k]] = odl+1;
				}
		}
		int wynik = 2e09;
		for(int i = 0; i <= k; ++i)
				for(int j = 0; j < sz[i]; ++j) wynik = min(wynik, dp[n][i][j]);
		
		if(wynik == 2e09) printf("impossible\n");
		else printf("%d\n", wynik);
		
		return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...