Guest User

Untitled

a guest
Dec 10th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <string>
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include <map>
  8.  
  9. using namespace std;
  10.  
  11. int prev_dna = 0;
  12.  
  13. struct Individual
  14. {
  15.     int Id;
  16.     int MotherId;
  17.     int FatherId;
  18.     int DNA;
  19.     char Sex;
  20.     bool alive;
  21.  
  22.     Individual (int id,char sex, int dna=0, int motherid=0,int fatherid=0) : Id(id), MotherId(motherid), FatherId(fatherid), Sex(sex), alive(true)
  23.     {
  24.         if(dna == 0)
  25.         {
  26.             prev_dna--;
  27.             DNA = prev_dna;
  28.         }
  29.         else
  30.         {
  31.             DNA = dna;
  32.         }
  33.     }
  34.     void setup (int id,char sex, int dna=0, int motherid=0,int fatherid=0)
  35.     {
  36.         Id = id;
  37.         Sex = sex;
  38.         MotherId = motherid;
  39.         FatherId = fatherid;
  40.         alive = true;
  41.         if(dna == 0)
  42.         {
  43.             prev_dna--;
  44.             DNA = prev_dna;
  45.         }
  46.         else
  47.         {
  48.             DNA = dna;
  49.         }
  50.     }
  51.     void show()
  52.     {
  53.         printf("%d %c %d %d %d %d\n", Id, Sex, DNA, MotherId, FatherId, alive);
  54.     }
  55. };
  56.  
  57. //vector<Individual*> individuals;
  58. Individual *individuals;
  59. int size;
  60.  
  61. int main()
  62. {
  63.     ifstream fi("eve.in");
  64.     ofstream fo("eve.out");
  65.  
  66.     int n=0;
  67.     fi>>n;
  68.     string asd;
  69.     getline(fi,asd);
  70.     individuals = (Individual*)malloc(sizeof(Individual)*n);
  71.     size = n;
  72.     map<int,vector<Individual*> > dnas;
  73.     for (int i=0;i<n;i++)
  74.     {
  75.         string sex;
  76.         getline(fi,sex);
  77.         //individuals.push_back(new Individual(i+1,sex[0]));
  78.         individuals[i].setup(i+1,sex[0]);
  79.     }
  80.     int m;
  81.     fi>>m;
  82.     getline(fi,asd);
  83.     Individual *_individuals = (Individual*)malloc(sizeof(Individual)*(n+m));
  84.     memcpy(_individuals, individuals, sizeof(Individual)*size);
  85.     individuals = _individuals;
  86.     for(int i=0;i<size;i++)
  87.     {
  88.         dnas[individuals[i].DNA].push_back(individuals+i);
  89.     }
  90.     for (int i=0;i<m;i++)
  91.     {
  92.         int id1;
  93.         fi>>id1;
  94.         if (id1<0)
  95.         {
  96.             individuals[-id1-1].alive = false;
  97.         }
  98.         else
  99.         {
  100.             int id2;//mother
  101.             string sex;
  102.             fi>>id2>>sex;
  103.             //individuals.push_back(new Individual(individuals.size()+1,sex[0],individuals[id2-1].DNA,id2,id1));
  104.             individuals[size].setup(size+1,sex[0],individuals[id2-1].DNA,id2,id1);
  105.             dnas[individuals[id2-1].DNA].push_back(individuals+size);
  106.             size++;
  107.         }
  108.     }
  109.     getline(fi,asd);
  110.     int k;
  111.     fi>>k;
  112.     for (int i=0;i<k;i++)
  113.     {
  114.         int id,dna,indiv_dna;
  115.         fi>>id>>dna;
  116.         indiv_dna = individuals[id-1].DNA;
  117.         for(int j=0;j<dnas[indiv_dna].size();j++)
  118.         {
  119.             dnas[indiv_dna][j]->DNA = dna; 
  120.         }
  121.         // for (int j=0;j<size;j++)
  122.         // {
  123.         //  if ((individuals[j].DNA == individuals[id-1].DNA) &&(j!=id-1) )
  124.         //  {
  125.         //      individuals[j].DNA = dna;
  126.         //  }
  127.         // }
  128.         //individuals[id-1].DNA = dna;
  129.     }
  130.  
  131.      // for (int i=0;i<size;i++)
  132.      // {
  133.      //     individuals[i].show();
  134.      // }
  135.     fi.close();
  136.  
  137.     //очистка от мертвых
  138.  
  139.     bool allpositive=true;
  140.     bool allnegative = true;
  141.     for (int i=0;i<size;i++)
  142.     {
  143.         if (individuals[i].alive)
  144.         {
  145.             if (individuals[i].DNA<0 )
  146.             {
  147.                 allpositive=false;
  148.             }
  149.             else
  150.             {
  151.                 allnegative = false;
  152.             }
  153.         }
  154.     }
  155.  
  156.     if (allpositive)
  157.     {
  158.         int dna=0;
  159.         bool same=true;
  160.         for (int i=0;i<size;i++)
  161.         {
  162.             if (individuals[i].alive)
  163.             {
  164.                 if (dna==0)
  165.                 {
  166.                     dna = individuals[i].DNA;
  167.                 }
  168.                 else
  169.                 {
  170.                     if (individuals[i].DNA != dna)
  171.                     {
  172.                         same = false;
  173.                         break;
  174.                     }
  175.                 }
  176.             }
  177.         }
  178.         if (same)
  179.         {
  180.             fo<<"YES"<<endl;
  181.         }
  182.         else
  183.             fo<<"NO"<<endl;
  184.     }
  185.     else if (allnegative)
  186.     {
  187.         int dna=0;
  188.         bool same=true;
  189.         for (int i=0;i<size;i++)
  190.         {
  191.             if (individuals[i].alive)
  192.             {
  193.                 if (dna==0)
  194.                 {
  195.                     dna = individuals[i].DNA;
  196.                 }
  197.                 else
  198.                 {
  199.                     if (individuals[i].DNA != dna)
  200.                     {
  201.                         same = false;
  202.                         break;
  203.                     }
  204.                 }
  205.             }
  206.         }
  207.         if (same)
  208.         {
  209.             fo<<"YES"<<endl;
  210.         }
  211.         else
  212.             fo<<"POSSIBLY"<<endl;
  213.     }
  214.     else
  215.     {
  216.         //положительные и отрицательные.
  217.         int dna=0;
  218.         bool same=true;
  219.         for (int i=0;i<size;i++)
  220.         {
  221.             if ((individuals[i].alive)&&(individuals[i].DNA>0))
  222.             {
  223.                 if (dna==0)
  224.                 {
  225.                     dna = individuals[i].DNA;
  226.                 }
  227.                 else
  228.                 {
  229.                     if (individuals[i].DNA != dna)
  230.                     {
  231.                         same = false;
  232.                         break;
  233.                     }
  234.                 }
  235.             }
  236.         }
  237.         if (same)
  238.         {
  239.             fo<<"POSSIBLY"<<endl;
  240.         }
  241.         else
  242.             fo<<"NO"<<endl;
  243.     }
  244.  
  245.     fo.close();
  246.     return 0;  
  247. }
Add Comment
Please, Sign In to add comment