Submission #1031110

#TimeUsernameProblemLanguageResultExecution timeMemory
1031110vjudge1Paths (BOI18_paths)C++17
100 / 100
444 ms25656 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define ld long double
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pld pair<ld, ld>
#define pb push_back
#define fi first
#define se second
#define debug(x) cout << #x << " => " << x << endl
#define all(x) x.begin(),x.end()

int n,m,k;
int c[300010];
vector<int> adj[300010];
vector<int> perm;
bool used[6],vis[300010];
ll dp[300010];
ll ans;

void solve()
{
	memset(dp,0,sizeof(dp));
	memset(vis,0,sizeof(vis));
	queue<pii> q;
	for(int i=1;i<=n;i++) if(c[i]==perm[0])
	{
		q.push({i,0});
		dp[i]=1;
	}
	while(!q.empty())
	{
		int u=q.front().fi,idx=q.front().se;
		q.pop();
		if(idx+1==perm.size()) continue;
		for(auto i : adj[u])
		{
			if(c[i]==perm[idx+1])
			{
				dp[i]+=dp[u];
				if(!vis[i]) q.push({i,idx+1});
				vis[i]=1;
			}
		}
		// debug(u);
		// for(int i=1;i<=4;i++) cout<<dp[i]<<' ';cout<<'\n';
	}
	for(int i=1;i<=n;i++) if(c[i]==perm.back())
	{
		ans+=dp[i];
	}
}

void genPerm(int sz)
{
	if(perm.size()==sz)
	{
		// for(auto i : perm) cout<<i<<' ';cout<<'\n';
		solve();
		// debug(ans);
		return;
	}
	for(int i=1;i<=k;i++)
	{
		if(!used[i])
		{
			used[i]=1;
			perm.pb(i);
			genPerm(sz);
			perm.pop_back();
			used[i]=0;
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) cin>>c[i];
	for(int i=1;i<=m;i++) 
	{
		int u,v;cin>>u>>v;
		adj[u].pb(v);
		adj[v].pb(u);
	}
	for(int sz=2;sz<=k;sz++) genPerm(sz);
	cout<<ans;
	return 0;
}

Compilation message (stderr)

paths.cpp: In function 'void solve()':
paths.cpp:37:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |   if(idx+1==perm.size()) continue;
      |      ~~~~~^~~~~~~~~~~~~
paths.cpp: In function 'void genPerm(int)':
paths.cpp:58:16: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   58 |  if(perm.size()==sz)
      |     ~~~~~~~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...