Advertisement
vercas

Best code - subject 1

Mar 4th, 2013
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.60 KB | None | 0 0
  1. #include<cstdio>
  2. #include<vector>
  3. #include<cstdlib>
  4. #define min(a,b) a<b?a:b
  5. using namespace std;
  6. vector<pair<int,int> >V[10010];
  7. vector<pair<int,int> >poz[10010];
  8. int n,A[10010],B[10010],i,vizS[10010],vizJ[10010],nr,cost,a,b,c,d,COST,contor;
  9. void solve(int,int);
  10. int main()
  11. {
  12.     freopen("biperm.in","r",stdin);
  13.     freopen("biperm.out","w",stdout);
  14.     scanf("%d",&n);
  15.     for(i=1;i<=n;i++)scanf("%d",&A[i]);
  16.     for(i=1;i<=n;i++)scanf("%d",&B[i]);
  17.     vizS[0]=vizJ[0]=1;
  18.     for(i=1;i<=n;i++)
  19.     {
  20.         V[A[i]].push_back(make_pair(B[i],i));
  21.         V[B[i]].push_back(make_pair(A[i],-i));
  22.     }
  23.     nr=1;
  24.     for(i=1;i<=n;i++)
  25.     {
  26.         if(!vizS[i])
  27.         {
  28.             contor=0;
  29.             cost=0;
  30.             nr*=2;
  31.             a=V[i].front().first;
  32.             b=V[i].front().second;
  33.             if(b<0)
  34.             {
  35.                 vector<pair<int,int> >::iterator it=V[i].begin()+1;
  36.                 c=it->first;
  37.                 d=it->second;
  38.                 if(d<0){cost+=1;solve(i,a);poz[abs(b)].push_back(make_pair(i,a));} else {solve(i,c);poz[abs(d)].push_back(make_pair(i,c));}
  39.             } else {solve(i,a);poz[abs(b)].push_back(make_pair(i,a));}
  40.             COST+=min(cost,contor-cost);
  41.         }
  42.     }
  43.     cost=min(COST,n-COST);
  44.     printf("%d %d\n",nr,cost);
  45.     for(i=1;i<=n;i++)
  46.     {
  47.         if(!poz[i].size())continue;
  48.         a=poz[i].front().first;
  49.         printf("%d ",a);
  50.     }
  51.     printf("\n");
  52.     for(i=1;i<=n;i++)
  53.     {
  54.         if(!poz[i].size())continue;
  55.         a=poz[i].front().second;
  56.         printf("%d ",a);
  57.     }
  58.     return 0;
  59. }
  60. void solve(int X,int Y)
  61. {
  62.     int a,b,c,d;
  63.     vizS[X]=1;vizJ[Y]=1;
  64.     contor++;
  65.     vector<pair<int,int> >::iterator it=V[Y].begin();
  66.     a=it->first;b=it->second;
  67.     if(a==X)a=0;
  68.     it++;
  69.     c=it->first;d=it->second;
  70.     if(c==X&&a!=0)c=0;
  71.     if(vizS[Y])
  72.     {
  73.         if(vizS[a])
  74.         {
  75.             if(!vizS[c])
  76.             {
  77.                 cost+=d>0?1:0;
  78.                 poz[abs(d)].push_back(make_pair(c,Y));
  79.                 solve(c,Y);
  80.             }
  81.         } else
  82.         {
  83.         cost+=b>0?1:0;
  84.         poz[abs(b)].push_back(make_pair(a,Y));
  85.         solve(a,Y);
  86.         }
  87.     }
  88.     if(!vizS[Y])
  89.     {
  90.         if(vizJ[a])
  91.         {
  92.             if(!vizJ[c])
  93.             {
  94.                 cost+=d>0?0:1;
  95.                 poz[abs(d)].push_back(make_pair(Y,c));
  96.                 solve(Y,c);
  97.             }
  98.         }else
  99.         {
  100.             cost+=b>0?0:1;
  101.             poz[abs(b)].push_back(make_pair(Y,a));
  102.             solve(Y,a);
  103.         }
  104.     }
  105. }
  106.  
  107. //TIA!!!!!!!!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement