Advertisement
Guest User

Untitled

a guest
Nov 19th, 2013
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <map>
  4.  
  5. #define INFL "in"
  6. #define OUTFL "out"
  7.  
  8. using namespace std;
  9.  
  10. #define NMax 100010
  11.  
  12. int n, m;
  13. int v[NMax];
  14.  
  15. int next[NMax];
  16. map<int, int> nextup;
  17.  
  18. int H[NMax], hdim;
  19. map<int, int> pos;
  20.  
  21. void downheap(int u) {
  22.     while(u <= hdim) {
  23.         int v = (u<<1);
  24.         if(v > hdim) return;
  25.  
  26.         if( v+1<=hdim && nextup[H[v+1]] > nextup[H[v]] ) ++v;
  27.  
  28.         if(nextup[H[u]] < nextup[H[v]]) {
  29.             int aux = pos[H[u]];
  30.             pos[H[u]] = pos[H[v]];
  31.             pos[H[v]] = aux;
  32.  
  33.             swap(H[v], H[u]);
  34.  
  35.             u = v;
  36.         }
  37.         else return;
  38.     }
  39. }
  40.  
  41. void upheap(int u) {
  42.     while(u > 1) {
  43.         int v = (u>>1);
  44.         if(nextup[H[u]] > nextup[H[v]]) {          
  45.             int aux = pos[H[u]];
  46.             pos[H[u]] = pos[H[v]];
  47.             pos[H[v]] = aux;
  48.  
  49.             swap(H[u], H[v]);
  50.             u = v;
  51.         }
  52.         else return;
  53.     }
  54. }
  55.  
  56. void solve() {
  57.     scanf("%d%d", &n, &m);
  58.  
  59.     while(true) {      
  60.        
  61.         for (int i = 1; i <= n; ++i) scanf("%d", &v[i]);
  62.  
  63.         //calculez next
  64.         for(int i=n; i>=1; --i) {
  65.             if(nextup.find(v[i]) == nextup.end()) nextup[v[i]] = n+1;
  66.             next[i] = nextup[v[i]];
  67.             nextup[v[i]] = i;
  68.         }
  69.  
  70.         //adaug primele m elemente in heap
  71.         for(int i=1; i<=m; ++i) {
  72.             pos[i] = ++hdim;
  73.             H[hdim] = i;
  74.            
  75.             upheap(hdim);
  76.         }
  77.  
  78.         int ans = 0;
  79.         for(int i=1; i<=n; ++i) {
  80.             if(pos.find(v[i]) != pos.end()) { //e in heap
  81.                 nextup[v[i]] = next[i];
  82.                 upheap(pos[v[i]]);
  83.             }
  84.             else { //scot primul din heap si il adaug pe acesta
  85.                 pos.erase(pos.find(H[1]));
  86.                 H[1] = H[hdim--];
  87.                 pos[H[1]] = 1;
  88.                 downheap(1);
  89.  
  90.                 ans++;
  91.  
  92.                 H[++hdim] = v[i];
  93.                 nextup[v[i]] = next[i];
  94.                 pos[v[i]] = hdim;
  95.                 upheap(hdim);
  96.             }
  97.         }      
  98.  
  99.         nextup.clear();
  100.         pos.clear();
  101.         hdim = 0;
  102.  
  103.         memset(v, 0, sizeof(v));
  104.         memset(H, 0, sizeof(H));
  105.         memset(next, 0, sizeof(next));
  106.  
  107.         if(scanf("%d%d", &n, &m) != 2) {
  108.             printf("%d", ans);
  109.             return;
  110.         }  
  111.  
  112.         printf("%d\n", ans);
  113.     }
  114. }
  115.  
  116. int main() {
  117. #define ONLINE_JUDGE 1
  118. #ifndef ONLINE_JUDGE
  119.     freopen(INFL, "r", stdin);
  120.     freopen(OUTFL, "w", stdout);
  121. #endif
  122.    
  123.     solve();
  124.    
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement