Advertisement
Guest User

Untitled

a guest
Jun 30th, 2019
664
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.27 KB | None | 0 0
  1. #include <iostream>
  2.  
  3.  
  4. struct animal{
  5.     int delta; //Akik rá mutatnak ennyivel tolni kell
  6.     int setid; //Melyik halmazba tartozik
  7. };
  8.  
  9. std::ostream& operator<<(std::ostream &os, animal &a){
  10.     std::cout<<"delta: "<<a.delta<<"\n";
  11.     std::cout<<"setid(parent): "<<a.setid<<"\n";
  12.     return os;
  13. }
  14.  
  15. int m3(int val){
  16.     return ((val%3)+3)%3;
  17. }
  18.  
  19.  
  20. class rules{
  21. public:
  22.     rules(int n){
  23.         this->badrule = 0;
  24.         this->n=n;
  25.         animals = new animal[n];
  26.         for(int i = 0; i < n;i++){
  27.             animals[i].setid = i;
  28.             animals[i].delta = 0;
  29.         }
  30.     }
  31.  
  32.     ~rules(){delete[] animals;}
  33.  
  34.     bool equal(int a, int b){
  35.         if(a==b)return true;
  36.         if(a>=n||b>=n)return (badrule++,false);
  37.  
  38.         int roota = getroot(a);
  39.         int rootb = getroot(b);
  40.  
  41.         int reala = getrealvalue(a);
  42.         int realb = getrealvalue(b);
  43.  
  44.  
  45.         if(roota == rootb){
  46.             bool check = reala == realb;
  47.             badrule+=!check;
  48.             return check;
  49.         }else{
  50.             if(reala != realb){
  51.                 get(rootb).delta += reala - realb;
  52.             }
  53.            
  54.             uni(b,a);
  55.             return true;
  56.         }
  57.     }
  58.  
  59.    
  60.     bool eat(int a, int b){
  61.         if(a==b)return (badrule++,false);
  62.         if(a>=n||b>=n)return (badrule++,false);
  63.  
  64.  
  65.         int roota = getroot(a);
  66.         int rootb = getroot(b);
  67.  
  68.         int reala = getrealvalue(a);
  69.         int realb = getrealvalue(b);
  70.  
  71.         if(roota == rootb){
  72.             bool check = reala == m3(realb-1);
  73.             badrule+=!check;
  74.             return check;
  75.         }else{
  76.             if(reala != m3(realb-1)){
  77.                 get(rootb).delta += m3(reala+1) - realb;
  78.             }
  79.            
  80.             uni(b,a);
  81.             return true;
  82.         }
  83.     }
  84.  
  85.  
  86.  
  87.     void debug_info(){
  88.         for(int i = 0;i<n;i++){
  89.             std::cout<<animals[i];
  90.             std::cout<<"root id: "<<getroot(i)<<"\n";
  91.             std::cout<<"real value: "<<getrealvalue(i)<<"\n";
  92.             std::cout<<"----\n";
  93.         }
  94.     }
  95.    
  96.     int get_delta(int a){
  97.         int sub=0;
  98.         if(animals[a].setid != a){
  99.             sub=get_delta(animals[a].setid);
  100.         }
  101.         return get(a).delta+sub;
  102.     }
  103.  
  104.     //Végig járja egészen a gyökér elemig, a deltákat összeadja majd eltolja
  105.     int getrealvalue(int a){
  106.         return m3(get_delta(a));
  107.     }
  108.  
  109.     int getparent(int a){
  110.         return animals[a].setid;
  111.     }
  112.  
  113.     int getroot(int a){
  114.         if(animals[a].setid != a)
  115.             return getroot(animals[a].setid);
  116.         return a;
  117.     }
  118.  
  119.     //a-t olvasztja
  120.     void uni(int a, int b){animals[getroot(a)].setid = getroot(b);}
  121.  
  122.     animal& get(int index){return animals[index];}
  123.  
  124.     int n;
  125.     int badrule;
  126.     animal * animals;
  127. };
  128.  
  129.  
  130. int main(){
  131.     int tcase;
  132.     scanf("%d",&tcase);
  133.  
  134.     while(tcase--){
  135.         int n,l;
  136.         scanf("%d %d",&n,&l);
  137.         rules r(n);
  138.  
  139.         int t,a,b;
  140.         while(l--){
  141.             scanf("%d %d %d",&t,&a,&b);
  142.             if(t==1){
  143.                 r.equal(a-1,b-1);
  144.             }else{
  145.                 r.eat(a-1,b-1);
  146.             }
  147.         }
  148.  
  149.         printf("%d",r.badrule);
  150.         if(tcase!=0)printf("\n");
  151.     }
  152.  
  153.     return 0;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement