Advertisement
Guest User

Untitled

a guest
Jun 18th, 2013
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include<iostream>
  2. #include<set>
  3. #include<algorithm>
  4. #include<map>
  5. using namespace std;
  6. int n,m,v[100100],sol;
  7. map <int,int> first; //first[x]=urmatoarea pozitie pe care apare x in lista
  8. map <int,bool> hand; //hand[x]=true daca il am pe x in grupul curent
  9. int next[100100]; //next[i]=pozitia urmatoare pe care se afla elementul v[i]
  10. struct Element{
  11.     int y;
  12.     Element(int yy)
  13.     {
  14.         y=yy;
  15.     }
  16.     bool operator <(const Element &A) const
  17.     {
  18.         return first[y]>first[A.y];
  19.     }
  20. };
  21. set <Element> H;
  22.  
  23. int main()
  24. {
  25.     int i,x;
  26.     set <Element>::iterator it;
  27.     while(cin>>n)
  28.     {
  29.         cin>>m;
  30.         sol=0;
  31.         for(i=1;i<=n;i++)
  32.             cin>>v[i];
  33.         // construiesc vectorul next pentru v
  34.         // si vectorul first pentru grupul 1,2,...,m
  35.         for(i=1;i<=m;i++)
  36.             first[i]=n+1;
  37.         for(i=n;i>0;i--)
  38.         {
  39.             if(first[v[i]])
  40.                 next[i]=first[v[i]];
  41.             else
  42.                 next[i]=n+1;
  43.             first[v[i]]=i;
  44.         }
  45.         // initializez grupul 1,2,...,m
  46.         for(i=1;i<=m;i++)
  47.         {
  48.             hand[i]=true;
  49.             H.insert(Element(i));
  50.         }
  51.         // rezolvarea in sine
  52.         for(i=1;i<=n;i++)
  53.         {
  54.             if(!hand[v[i]]) // nu am elementul in grup
  55.             {
  56.                 sol++; // chem un prieten
  57.                 first[v[i]]=next[i];
  58.                 hand[v[i]]=true;
  59.                 H.insert(Element(v[i])); // inserez elementul primit
  60.                 it=H.begin();
  61.                 x=(*it).y;
  62.                 hand[x]=false;
  63.                 H.erase(it); // sterg elementul care apare cel mai departe
  64.             }
  65.             else // am deja elementul in grup
  66.             {
  67.                 H.erase(H.find(Element(v[i])));
  68.                 first[v[i]]=next[i];
  69.                 H.insert(Element(v[i]));
  70.             }
  71.         }
  72.         cout<<sol<<"\n";
  73.         first.clear();
  74.         hand.clear();
  75.         H.clear();
  76.         for(i=1;i<=n;i++)
  77.             next[i]=0;
  78.     }
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement