Cod sursa(job #1237158)

Utilizator andreey_047Andrei Maxim andreey_047 Data 3 octombrie 2014 10:45:06
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 4.41 kb
#include <iostream>
#include <cstdio>
#define in "biperm.in","r",stdin
#define out "biperm.out","w",stdout
#include <vector>
#define nmax 10009
using namespace std;
int n,A[3][nmax],viz[nmax],nr,vi[nmax],vf[nmax],nri,nrf,nrt;
vector<int>G[nmax],d[nmax],aux[nmax],aux1[nmax],ad[nmax],ag[nmax],add[nmax],S[nmax],w;
void Going(int k,int q){
 int x,y,i,j;
  x = G[k][q];
                if(d[x][0]==k&&d[x].size()==2)
                        d[x][0]=d[x][1];
                        d[x].pop_back();
                    nri=0;
                    cout << k <<' '<<x<<' ';
                    viz[k]=viz[x]=1;
             while(x!=k){
                if(!G[x].size()){
                    nri++;
                    y=x;
                  x=d[x][0];
                  if(G[x][0]==y&&G[x].size()==2)
                    G[x][0]=G[x][1];
                  G[x].pop_back();
                }
                else{ y=x;
                 x = G[x][0];
                    if(d[x][0]==y&&d[x].size()==2)
                      d[x][0]=d[x][1];
                     d[x].pop_back();
                 }
                 cout << x <<' ';
                 viz[x]=1;
               }
            cout << nri<<'\n';
       // nr+=nri;
}
void Going2(int k,int q){
 int x,y,i,j;
  x = ag[k][q];
                if(d[x][0]==k&&ad[x].size()==2)
                        ad[x][0]=ad[x][1];
                        ad[x].pop_back();
                    nrf=0;
                    cout << k <<' '<<x<<' ';
                   vi[k]=vi[x]=1;
             while(x!=k){
                if(!ag[x].size()){
                    nrf++;
                    y=x;
                  x=ad[x][0];
                  if(ag[x][0]==y&&ag[x].size()==2)
                    ag[x][0]=ag[x][1];
                  ag[x].pop_back();
                }
                else{ y=x;
                 x = ag[x][0];
                    if(ad[x][0]==y&&ad[x].size()==2)
                      ad[x][0]=ad[x][1];
                     ad[x].pop_back();
                 }
                 vi[x]=1;
                 cout << x <<' ';
               }
            cout<<'\n';
}
void Going3(int k,int q){
 int x,y,i,j;
  x = G[k][q];
                if(d[x][0]==k&&d[x].size()==2)
                        d[x][0]=d[x][1];
                        d[x].pop_back();
                    nri=0;
                   // cout << k <<' '<<x<<' ';
                    vf[k]=vf[x]=1;
             while(x!=k){
                if(!G[x].size()){
                    nri++;
                    y=x;
                  x=d[x][0];
                  if(G[x][0]==y&&G[x].size()==2)
                    G[x][0]=G[x][1];
                  G[x].pop_back();
                }
                else{ y=x;
                 x = G[x][0];
                    if(d[x][0]==y&&d[x].size()==2)
                      d[x][0]=d[x][1];
                     d[x].pop_back();
                 }
                // cout << x <<' ';
                 vf[x]=1;
               }
           // cout << nri<<'\n';
}
int main(){
    int i,j,x,ii,p,y;
    freopen(in);
    freopen(out);
    scanf("%d",&n);
    for(i=1;i<=2;i++)
        for(j=1;j<=n;j++)
         scanf("%d",&A[i][j]);
  for(i=1;i<=n;i++){
    G[A[1][i]].push_back(A[2][i]);
    d[A[2][i]].push_back(A[1][i]);
    ag[A[1][i]].push_back(A[2][i]);
    ad[A[2][i]].push_back(A[1][i]);
  }
  p=0;
  for(i=1;i<=n;i++){
    if(!viz[A[1][i]]){
        if(G[A[1][i]].size()==1){

            Going(A[1][i],0);
          nrt+=nri;
          p++;
        }
        else if(G[A[1][i]].size()==2){
            p++;
            Going2(A[1][i],0);
            Going3(A[1][i],1);
            if(nri>=nrf){
             for(j=1;j<=n;j++)
             if(vf[A[1][j]])
              viz[A[1][j]] = vf[A[1][j]];
            }
            else
             for(j=1;j<=n;j++)
             if(vi[A[1][j]])
              viz[A[1][j]]=vi[A[1][j]];
            nrt=nrt+min(nri,nrf);
        }
    }
  }
//   cout << G[18][1]<<' ';
//   Going(1,0);
//   Going(5,0);
//   Going(2,0);
//   Going(3,0);
   int sol;
   sol=1;
 for(i=1;i<=p;i++)
  sol*=2;
   cout <<sol<<' '<<nrt<<'\n';
   cout<<'\n';
//  for(i=1;i<=n;i++)
//  {
//      cout << A[1][i]<<' ';
//      if(G[A[1][i]].size())
//    cout << G[A[1][i]][0]<<' ';
//    if(d[A[1][i]].size())
//     cout<<d[A[1][i]][0]<<' ';
//    cout << '\n';
//    }
    return 0;
}