Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.67 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using LL = long long int;
  5. using ULL = unsigned long long int;
  6.  
  7. template <class TH> void _dbg(const char *sdbg, TH h){cerr<<sdbg<<"="<<h<<"\n";}
  8. template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
  9.   while(*sdbg!=',')
  10.     cerr<<*sdbg++;
  11.   cerr<<"="<<h<<",";
  12.   _dbg(sdbg+1, a...);
  13. }
  14.  
  15. template<class T> ostream & operator<<(ostream & os, vector<T> V){
  16.   os<<"[";
  17.   for(auto vv: V) os << vv <<",";
  18.   return os << "]";
  19. }
  20. template<class L, class R> ostream & operator <<(ostream & os, pair<L,R> P){
  21.   return os <<"("<<P.st <<","<<P.nd <<")";
  22. }
  23.  
  24. #ifdef DEBUG
  25. #define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
  26. #else
  27. #define debug(...) (__VA_ARGS__)
  28. #define cerr if(0)cout
  29. #endif
  30.  
  31. int n, r, c;
  32. int base = 1;
  33.  
  34. struct Node {
  35.   int w[4];
  36.   int size;
  37. };
  38. Node tree[4000000];
  39.  
  40. // dd
  41. // du
  42. // ud
  43. // uu
  44.  
  45. void setVal(Node& x, int a, int b, int c, int d, int e) {
  46.   x.w[0] = a;
  47.   x.w[1] = b;
  48.   x.w[2] = c;
  49.   x.w[3] = d;
  50.   x.size = e;
  51. }
  52.  
  53. void setMin(int& val, int& a, int& b) {
  54.   if (a != -1 && b != -1) {
  55.     if (val == -1) {
  56.       val = a + b;
  57.     }
  58.     val = min(val, a + b);
  59.   }
  60. }
  61.  
  62. void upd(Node& node, Node& a, Node& b) {
  63.   setMin(node.w[0], a.w[0], b.w[2]);
  64.   setMin(node.w[0], a.w[1], b.w[0]);
  65.  
  66.   setMin(node.w[1], a.w[0], b.w[3]);
  67.   setMin(node.w[1], a.w[1], b.w[1]);
  68.  
  69.   setMin(node.w[2], a.w[2], b.w[2]);
  70.   setMin(node.w[2], a.w[3], b.w[0]);
  71.  
  72.   setMin(node.w[3], a.w[2], b.w[3]);
  73.   setMin(node.w[3], a.w[3], b.w[1]);
  74.  
  75.   for (int i = 0; i < 4; ++i) {
  76.     setMin(node.w[i], a.w[i], b.size);
  77.     setMin(node.w[i], b.w[i], a.size);
  78.   }
  79.  
  80.   node.size = a.size + b.size;
  81. }
  82.  
  83. void update(int w) {
  84.   w += base - 1;
  85.   setVal(tree[w], 0, -1, -1, 0, 1);
  86.  
  87.   while (w != 1) {
  88.     w /= 2;
  89.     upd(tree[w], tree[w * 2], tree[w * 2 + 1]);
  90.   }
  91. }
  92.  
  93. LL getMin() {
  94.   int x = 1 << 30;
  95.   for (int i = 0; i < 4; ++i) {
  96.     if (tree[1].w[i] != -1) {
  97.       x = min(tree[1].w[i], x);
  98.     }
  99.   }
  100.  
  101.   return (LL)x;
  102. }
  103.  
  104. int main() {
  105.   cin >> n >> c >> r;
  106.   while (base < n) {
  107.     base *= 2;
  108.   }
  109.   for (int i = 1; i < base; ++i) {
  110.     setVal(tree[i], -1, -1, -1, -1, 0);
  111.   }
  112.   for (int i = base; i < 2 * base; ++i) {
  113.     setVal(tree[i], 0, 0, 0, 0, 0);
  114.   }
  115.  
  116.   vector<pair<int, int>> events;
  117.   int cnt0 = 0;
  118.   for (int i = 1; i <= n; ++i) {
  119.     int x;
  120.     cin >> x;
  121.     events.push_back({abs(x) + 1, i});
  122.     if (x == 0) {
  123.       ++cnt0;
  124.       setVal(tree[i + base - 1], -1, -1, -1, -1, 1);
  125.       continue;
  126.     }
  127.     if (x < 0) {
  128.       setVal(tree[i + base - 1], -1, -1, -1, 0, 1);
  129.     } else {
  130.       setVal(tree[i + base - 1], 0, -1, -1, -1, 1);
  131.     }
  132.   }
  133.   if (cnt0 == n) {
  134.     cout << min((LL)r * (LL)n, (LL)c);
  135.     return 0;
  136.   }
  137.   for (int i = base - 1; i >= 1; --i) {
  138.     upd(tree[i], tree[i * 2], tree[i * 2 + 1]);
  139.   }
  140.  
  141.   LL res = getMin() * (LL)r;
  142.   // for (int i = 1; i < 2 * base; ++i) {
  143.   //   cout << i << " :: " << tree[i].w[0] << " " << tree[i].w[1] << " " << tree[i].w[2] << " " << tree[i].w[3] << endl;
  144.   // }
  145.  
  146.   sort(events.begin(), events.end());
  147.   // debug(res);
  148.   for (int i = 0; i < (int)events.size(); ++i) {
  149.     auto event = events[i];
  150.     update(event.second);
  151.     while (i + 1 < (int)events.size() && events[i].first == events[i + 1].first) {
  152.       ++i;
  153.       update(events[i].second);
  154.     }
  155.     // debug(getMin(), event.first);
  156.     // if (event.first == 1) {
  157.     //   for (int i = 1; i < 2 * base; ++i) {
  158.     //     cout << i << " :: " << tree[i].w[0] << " " << tree[i].w[1] << " " << tree[i].w[2] << " " << tree[i].w[3] << endl;
  159.     //   }
  160.     // }
  161.     res = min(res, getMin() * (LL)r + (LL)event.first * (LL)c);
  162.   }
  163.   cout << res << endl;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement