Advertisement
add1ctus

Table

Sep 4th, 2015
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <cstring>
  3. #include <set>
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.     int t;
  10.     scanf("%d",&t); //Број на тестови
  11.     while(t--) //Додека т е поголемо од 0
  12.     {
  13.         int n;
  14.         scanf("%d",&n);
  15.  
  16.         int totalDeleted=0; //Колку вкупно колони сме избршале
  17.         int rowcount[3][n+1]; //rowcount[x][y] - Колку пати бројот y се појавува во ред x
  18.         bool deleted[n]; //deleted[x] - true доколку колона x е избришана
  19.         memset(rowcount,0,sizeof(rowcount)); //Се пополнува матрицата rowcount со вредност 0
  20.         memset(deleted,false,sizeof(deleted)); //Исто за низата deleted со false
  21.  
  22.         int mat[3][n]; //Ова е за input-от
  23.         for(int r=0;r<3;++r)
  24.             for(int i=0;i<n;++i)
  25.             {
  26.                 scanf("%d",&mat[r][i]);
  27.                 rowcount[r][mat[r][i]]++;
  28.             }
  29.  
  30.         set<int> toDelete; //Тука ќе ги чуваме броевите кои треба да ги избришеме.
  31.         //Со множество можеме лесно да провериме дали некој број е внатре или не, и исто така не се ставаат дупликати.
  32.        
  33.         for(int i=1;i<=n;++i) //Проверуваме за сите броеви дали бројот го нема во некој ред а го има во друг
  34.         {                     //Доколку се исполни таков услов, го ставаме тој број во toDelete
  35.             if(rowcount[0][i]==0 && (rowcount[1][i]>0 || rowcount[2][i]>0))
  36.                 toDelete.insert(i);
  37.             else if(rowcount[1][i]==0 && (rowcount[0][i]>0 || rowcount[2][i]>0))
  38.                 toDelete.insert(i);
  39.             else if(rowcount[2][i]==0 && (rowcount[0][i]>0 || rowcount[1][i]>0))
  40.                 toDelete.insert(i);
  41.         }
  42.  
  43.         while(!toDelete.empty()) //Се додека има броеви за бришење
  44.         {
  45.             for(int r=0;r<3;++r)
  46.                 for(int i=0;i<n;++i) //Го изминуваме целиот input
  47.                     if(toDelete.find(mat[r][i])!=toDelete.end() && !deleted[i]) //Доколку бројот на таа позиција се наоѓа во toDelete и колоната не е избришана
  48.                     {
  49.                         deleted[i]=true; //Ја означуваме колоната како избришана (да не ја бришеме повеќе пати)
  50.                         rowcount[0][mat[0][i]]--;  //Бидејќи сме го избришале бројот mat[0][i] од редица 0, го намалуваме бројачот за 1
  51.                         rowcount[1][mat[1][i]]--;
  52.                         rowcount[2][mat[2][i]]--;
  53.                         totalDeleted++;
  54.                     }
  55.             toDelete.clear(); //Сме завршиле со бришење на овие броеви, го празниме множеството
  56.  
  57.             for(int i=1;i<=n;++i) //Исто како кодот горе, бараме дали има нови броеви кои треба да се бришат
  58.             {
  59.                 if(rowcount[0][i]==0 && (rowcount[1][i]>0 || rowcount[2][i]>0))
  60.                     toDelete.insert(i);
  61.                 else if(rowcount[1][i]==0 && (rowcount[0][i]>0 || rowcount[2][i]>0))
  62.                     toDelete.insert(i);
  63.                 else if(rowcount[2][i]==0 && (rowcount[0][i]>0 || rowcount[1][i]>0))
  64.                     toDelete.insert(i);
  65.             }
  66.         } //Доколку има нови броеви за бришење, ќе започне повторно while циклусот. Во спротивно, печати резултат
  67.         printf("%d\n",totalDeleted);
  68.     }
  69.     return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement