Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <string>
- #include <cstdlib>
- #include <cstring>
- #include <map>
- using namespace std;
- int prev_dna = 0;
- struct Individual
- {
- int Id;
- int MotherId;
- int FatherId;
- int DNA;
- char Sex;
- bool alive;
- Individual (int id,char sex, int dna=0, int motherid=0,int fatherid=0) : Id(id), MotherId(motherid), FatherId(fatherid), Sex(sex), alive(true)
- {
- if(dna == 0)
- {
- prev_dna--;
- DNA = prev_dna;
- }
- else
- {
- DNA = dna;
- }
- }
- void setup (int id,char sex, int dna=0, int motherid=0,int fatherid=0)
- {
- Id = id;
- Sex = sex;
- MotherId = motherid;
- FatherId = fatherid;
- alive = true;
- if(dna == 0)
- {
- prev_dna--;
- DNA = prev_dna;
- }
- else
- {
- DNA = dna;
- }
- }
- void show()
- {
- printf("%d %c %d %d %d %d\n", Id, Sex, DNA, MotherId, FatherId, alive);
- }
- };
- //vector<Individual*> individuals;
- Individual *individuals;
- int size;
- int main()
- {
- ifstream fi("eve.in");
- ofstream fo("eve.out");
- int n=0;
- fi>>n;
- string asd;
- getline(fi,asd);
- individuals = (Individual*)malloc(sizeof(Individual)*n);
- size = n;
- map<int,vector<Individual*> > dnas;
- for (int i=0;i<n;i++)
- {
- string sex;
- getline(fi,sex);
- //individuals.push_back(new Individual(i+1,sex[0]));
- individuals[i].setup(i+1,sex[0]);
- }
- int m;
- fi>>m;
- getline(fi,asd);
- Individual *_individuals = (Individual*)malloc(sizeof(Individual)*(n+m));
- memcpy(_individuals, individuals, sizeof(Individual)*size);
- individuals = _individuals;
- for(int i=0;i<size;i++)
- {
- dnas[individuals[i].DNA].push_back(individuals+i);
- }
- for (int i=0;i<m;i++)
- {
- int id1;
- fi>>id1;
- if (id1<0)
- {
- individuals[-id1-1].alive = false;
- }
- else
- {
- int id2;//mother
- string sex;
- fi>>id2>>sex;
- //individuals.push_back(new Individual(individuals.size()+1,sex[0],individuals[id2-1].DNA,id2,id1));
- individuals[size].setup(size+1,sex[0],individuals[id2-1].DNA,id2,id1);
- dnas[individuals[id2-1].DNA].push_back(individuals+size);
- size++;
- }
- }
- getline(fi,asd);
- int k;
- fi>>k;
- for (int i=0;i<k;i++)
- {
- int id,dna,indiv_dna;
- fi>>id>>dna;
- indiv_dna = individuals[id-1].DNA;
- for(int j=0;j<dnas[indiv_dna].size();j++)
- {
- dnas[indiv_dna][j]->DNA = dna;
- }
- // for (int j=0;j<size;j++)
- // {
- // if ((individuals[j].DNA == individuals[id-1].DNA) &&(j!=id-1) )
- // {
- // individuals[j].DNA = dna;
- // }
- // }
- //individuals[id-1].DNA = dna;
- }
- // for (int i=0;i<size;i++)
- // {
- // individuals[i].show();
- // }
- fi.close();
- //очистка от мертвых
- bool allpositive=true;
- bool allnegative = true;
- for (int i=0;i<size;i++)
- {
- if (individuals[i].alive)
- {
- if (individuals[i].DNA<0 )
- {
- allpositive=false;
- }
- else
- {
- allnegative = false;
- }
- }
- }
- if (allpositive)
- {
- int dna=0;
- bool same=true;
- for (int i=0;i<size;i++)
- {
- if (individuals[i].alive)
- {
- if (dna==0)
- {
- dna = individuals[i].DNA;
- }
- else
- {
- if (individuals[i].DNA != dna)
- {
- same = false;
- break;
- }
- }
- }
- }
- if (same)
- {
- fo<<"YES"<<endl;
- }
- else
- fo<<"NO"<<endl;
- }
- else if (allnegative)
- {
- int dna=0;
- bool same=true;
- for (int i=0;i<size;i++)
- {
- if (individuals[i].alive)
- {
- if (dna==0)
- {
- dna = individuals[i].DNA;
- }
- else
- {
- if (individuals[i].DNA != dna)
- {
- same = false;
- break;
- }
- }
- }
- }
- if (same)
- {
- fo<<"YES"<<endl;
- }
- else
- fo<<"POSSIBLY"<<endl;
- }
- else
- {
- //положительные и отрицательные.
- int dna=0;
- bool same=true;
- for (int i=0;i<size;i++)
- {
- if ((individuals[i].alive)&&(individuals[i].DNA>0))
- {
- if (dna==0)
- {
- dna = individuals[i].DNA;
- }
- else
- {
- if (individuals[i].DNA != dna)
- {
- same = false;
- break;
- }
- }
- }
- }
- if (same)
- {
- fo<<"POSSIBLY"<<endl;
- }
- else
- fo<<"NO"<<endl;
- }
- fo.close();
- return 0;
- }
Add Comment
Please, Sign In to add comment