Advertisement
jedrzejd

Bartek

Jan 3rd, 2019 (edited)
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <utility>
  6. #include <cmath>
  7. #include <vector>
  8. #define pb push_back
  9. #define mp make_pair
  10. #define f first
  11. #define s second
  12. const int MXN=8;//1e6;
  13. using namespace std;
  14. typedef pair<int,int>PI;
  15. struct wezel{
  16.     int war,ile,zasieg;
  17.     bool ok;
  18. };
  19. vector<pair<int,PI> >kol[MXN+5],kol1[MXN+5];
  20. int n,m,k,wynik;
  21. wezel tab[3*MXN];
  22. int a,b,c;
  23. void dodaj(int v,int jakiek,int daleko){
  24.     v+=MXN-1;
  25.     if(tab[v].ile==0){
  26.         tab[v].ile=1;
  27.         tab[v].zasieg=daleko;
  28.         tab[v].war=jakiek;
  29.         tab[v].ok=1;
  30.     }
  31.     else{
  32.         tab[v].ile++;
  33.         if(tab[v].zasieg<daleko){
  34.             tab[v].zasieg=daleko;
  35.             tab[v].war=jakiek;
  36.         }
  37.         tab[v].ok=0;
  38.     }
  39.     while(v>0){
  40.         v/=2;
  41.         if(tab[2*v].ok==1&&tab[2*v+1].ok==1&&tab[2*v].war<=tab[2*v+1].war){
  42.             tab[v].ok=1;
  43.             tab[v].war=tab[2*v+1].war;
  44.             tab[v].ile=1;
  45.         }
  46.         else {
  47.             tab[v].ok=0;
  48.             tab[v].ile=0;
  49.         }
  50.     }
  51. }
  52. void usun(int v,int jakiek,int daleko){
  53.     v+=MXN-1;
  54.     if(tab[v].ile==1){
  55.         tab[v].ile=0;
  56.         tab[v].zasieg=0;
  57.         tab[v].war=0;
  58.         tab[v].ok=0;
  59.     }
  60.     else if(tab[v].ile==2){
  61.         tab[v].ile--;
  62.         tab[v].ok=1;
  63.     }
  64.     else if(tab[v].ile>2){
  65.         tab[v].ile--;
  66.     }
  67.     while(v>0){
  68.         v/=2;
  69.         if(tab[2*v].ok==1&&tab[2*v+1].ok==1&&tab[2*v].war<=tab[2*v+1].war){
  70.             tab[v].ok=1;
  71.             tab[v].war=tab[2*v+1].war;
  72.         }
  73.         else {
  74.             tab[v].ok=0;
  75.             tab[v].ile=0;
  76.         }
  77.     }
  78. }
  79. void count(){
  80.     if(tab[1].ok==1&&tab[1].ile==1)wynik++;
  81. }
  82. void ustaw(int v){
  83.     v+=MXN-1;
  84.     tab[v].war=0;
  85.     tab[v].ile=0;
  86.     tab[v].ok=0;
  87.     while(v>0){
  88.         v/=2;
  89.         tab[v].war=0;
  90.         tab[v].ile=0;
  91.         tab[v].ok=0;
  92.     }
  93. }
  94. int main(){
  95.     for(int i=1;i<=2*MXN;i++){
  96.         tab[i].war=1e9;
  97.         tab[i].ile=1;
  98.         tab[i].ok=1;
  99.     }
  100.     scanf("%d%d%d",&n,&m,&k);
  101.     for(int i=1;i<=k;i++){
  102.         ustaw(i);
  103.     }
  104.     for(int i=1;i<=m;i++){
  105.         scanf("%d%d%d",&c,&a,&b);
  106.         kol[a].pb(mp(i,mp(b,c)));
  107.         kol1[b].pb(mp(i,mp(a,c)));
  108.     }
  109.     for(int war=1;war<=m;war++){
  110.         for(int i=0;i<kol[war].size();i++){
  111.             a=kol[war][i].s.s;b=kol[war][i].f;c=kol[war][i].s.f;
  112.             dodaj(a,b,c);
  113.         }
  114.         count();
  115.         for(int i=0;i<kol1[war].size();i++){
  116.             a=kol1[war][i].s.s;b=kol1[war][i].f;c=kol1[war][i].s.f;
  117.             usun(a,b,c);
  118.         }
  119.     }
  120.     printf("%d\n",wynik);
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement