Pagini recente » Cod sursa (job #1146702) | Cod sursa (job #1323712) | Cod sursa (job #2862804) | Cod sursa (job #3288158) | Cod sursa (job #1239184)
/// Craciun Catalin
/// Biperm2
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cmath>
#define NMax 10005
using namespace std;
ifstream f("biperm.in");
ofstream g("biperm.out");
int n;
vector<int> Vec[NMax]; /// Vecini neorientat
vector<int> OVec[NMax]; /// Vecini orientat
bool vis[NMax];
int X[NMax];
int compConexe = 0;
int Y[NMax];
int len = 0;
int sum = 0;
int sumLeft = 0;
int sumRight = 0;
inline int minim(int a, int b) { if (a<b) return a; return b; }
void dfs(int k) {
len++;
vis[k] = true;
for (int i=0;i<Vec[k].size();i++) {
if (!vis[Vec[k][i]]) {
vis[Vec[k][i]] = true;
bool contains = false;
for (int j=0;j<OVec[k].size();j++) {
if (OVec[k][j] == Vec[k][i])
contains = true;
}
if (contains)
sumLeft++;
else
sumRight++;
dfs(Vec[k][i]);
}
}
}
int main() {
f>>n; memset(vis, false, sizeof(vis));
for (int i=1;i<=n;i++)
f>>X[i];
for (int i=1;i<=n;i++)
f>>Y[i];
for (int i=1;i<=n;i++) {
Vec[X[i]].push_back(Y[i]);
Vec[Y[i]].push_back(X[i]);
OVec[X[i]].push_back(Y[i]);
}
sumLeft = 0; sumRight = 0;
for (int i=1;i<=n;i++) {
if (!vis[i]) {
len = 0;
dfs(i);
if (len > 1)
compConexe++;
}
}
sum = minim(sumLeft, sumRight);
g<<(long long)powl(2, compConexe)<<' '<<sum<<'\n';
return 0;
}