Advertisement
Guest User

Untitled

a guest
May 24th, 2015
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <map>
  3. #include <queue>
  4. #include <algorithm>
  5. #include <set>
  6.  
  7. using namespace std;
  8. #define MAXN 131072
  9. int type[MAXN];
  10. int height[MAXN];
  11. long long dp[MAXN];
  12. int dQ[MAXN];
  13.  
  14.  
  15. int main() {
  16. //  freopen("in.txt", "r+t", stdin);
  17. //  freopen("out.txt", "w+t", stdout);
  18.  
  19.     int testcase = 0 , cases = 0;
  20.     int n;
  21.     scanf("%d", &testcase);
  22.     while (testcase --)
  23.     {
  24.         scanf("%d", &n);
  25.         for (int i = 1; i <= n; i++)
  26.             scanf("%d %d", &type[i], &height[i]);
  27.  
  28.         map<int, int> R;
  29.  
  30.         int L = 0;
  31.         dp[0] = 0;
  32.  
  33.         multiset<long long> S;
  34.  
  35.  
  36.         int head = 0, rear = -1;
  37.  
  38.         for (int i = 1; i <= n; i++) {
  39.  
  40.             int &y = R[type[i]];
  41.             L = max (L, y);
  42.             y = i;
  43.  
  44.             int first = head;
  45.             while (head <= rear && dQ[head] <= L)
  46.             {
  47.                 head ++;
  48.                 if(head > rear) continue;
  49.                 multiset<long long>::iterator it;
  50.                 it = S.find(dp[dQ[head - 1]] + height[dQ[head]]);
  51.                 if(it != S.end())
  52.                     S.erase(it);
  53.             }
  54.             while (head <= rear && height[dQ[rear]] <= height[i])
  55.             {
  56.                 if(rear - 1 >= head)
  57.                 {
  58.                     multiset<long long>::iterator it;
  59.                     it = S.find(dp[dQ[rear - 1]] + height[dQ[rear]]);
  60.                     if(it != S.end())
  61.                         S.erase(it);
  62.                 }
  63.                 rear --;
  64.             }
  65.  
  66.             dQ[++ rear] = i;
  67.             if(rear - 1 >=  head)
  68.                 S.insert(dp[dQ[rear - 1]] + height[dQ[rear]]);
  69.  
  70.             dp[i] = 1LL << 60;
  71.  
  72.             /*for (int j = head; j <= rear; j++) {
  73.                 if (j != head)
  74.                     dp[i] = min(dp[i], dp[dQ[j-1]] + height[dQ[j]]);
  75.                 else
  76.                     dp[i] = min(dp[i], dp[L] + height[dQ[j]]);
  77.             }*/
  78.  
  79.             if((int)S.size() > 0)
  80.                 dp[i] = min(dp[i] , *(S.begin()));
  81.             if(head <= rear)
  82.                 dp[i] = min(dp[i] , dp[L] + height[dQ[head]]);
  83.         }
  84.         printf("Case %d: %lld\n", ++ cases, dp[n]);
  85.     }
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement