Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using LL = long long int;
- using ULL = unsigned long long int;
- template <class TH> void _dbg(const char *sdbg, TH h){cerr<<sdbg<<"="<<h<<"\n";}
- template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
- while(*sdbg!=',')
- cerr<<*sdbg++;
- cerr<<"="<<h<<",";
- _dbg(sdbg+1, a...);
- }
- template<class T> ostream & operator<<(ostream & os, vector<T> V){
- os<<"[";
- for(auto vv: V) os << vv <<",";
- return os << "]";
- }
- template<class L, class R> ostream & operator <<(ostream & os, pair<L,R> P){
- return os <<"("<<P.st <<","<<P.nd <<")";
- }
- #ifdef DEBUG
- #define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
- #else
- #define debug(...) (__VA_ARGS__)
- #define cerr if(0)cout
- #endif
- int n, r, c;
- int base = 1;
- struct Node {
- int w[4];
- int size;
- };
- Node tree[4000000];
- // dd
- // du
- // ud
- // uu
- void setVal(Node& x, int a, int b, int c, int d, int e) {
- x.w[0] = a;
- x.w[1] = b;
- x.w[2] = c;
- x.w[3] = d;
- x.size = e;
- }
- void setMin(int& val, int& a, int& b) {
- if (a != -1 && b != -1) {
- if (val == -1) {
- val = a + b;
- }
- val = min(val, a + b);
- }
- }
- void upd(Node& node, Node& a, Node& b) {
- setMin(node.w[0], a.w[0], b.w[2]);
- setMin(node.w[0], a.w[1], b.w[0]);
- setMin(node.w[1], a.w[0], b.w[3]);
- setMin(node.w[1], a.w[1], b.w[1]);
- setMin(node.w[2], a.w[2], b.w[2]);
- setMin(node.w[2], a.w[3], b.w[0]);
- setMin(node.w[3], a.w[2], b.w[3]);
- setMin(node.w[3], a.w[3], b.w[1]);
- for (int i = 0; i < 4; ++i) {
- setMin(node.w[i], a.w[i], b.size);
- setMin(node.w[i], b.w[i], a.size);
- }
- node.size = a.size + b.size;
- }
- void update(int w) {
- w += base - 1;
- setVal(tree[w], 0, -1, -1, 0, 1);
- while (w != 1) {
- w /= 2;
- upd(tree[w], tree[w * 2], tree[w * 2 + 1]);
- }
- }
- LL getMin() {
- int x = 1 << 30;
- for (int i = 0; i < 4; ++i) {
- if (tree[1].w[i] != -1) {
- x = min(tree[1].w[i], x);
- }
- }
- return (LL)x;
- }
- int main() {
- cin >> n >> c >> r;
- while (base < n) {
- base *= 2;
- }
- for (int i = 1; i < base; ++i) {
- setVal(tree[i], -1, -1, -1, -1, 0);
- }
- for (int i = base; i < 2 * base; ++i) {
- setVal(tree[i], 0, 0, 0, 0, 0);
- }
- vector<pair<int, int>> events;
- int cnt0 = 0;
- for (int i = 1; i <= n; ++i) {
- int x;
- cin >> x;
- events.push_back({abs(x) + 1, i});
- if (x == 0) {
- ++cnt0;
- setVal(tree[i + base - 1], -1, -1, -1, -1, 1);
- continue;
- }
- if (x < 0) {
- setVal(tree[i + base - 1], -1, -1, -1, 0, 1);
- } else {
- setVal(tree[i + base - 1], 0, -1, -1, -1, 1);
- }
- }
- if (cnt0 == n) {
- cout << min((LL)r * (LL)n, (LL)c);
- return 0;
- }
- for (int i = base - 1; i >= 1; --i) {
- upd(tree[i], tree[i * 2], tree[i * 2 + 1]);
- }
- LL res = getMin() * (LL)r;
- // for (int i = 1; i < 2 * base; ++i) {
- // cout << i << " :: " << tree[i].w[0] << " " << tree[i].w[1] << " " << tree[i].w[2] << " " << tree[i].w[3] << endl;
- // }
- sort(events.begin(), events.end());
- // debug(res);
- for (int i = 0; i < (int)events.size(); ++i) {
- auto event = events[i];
- update(event.second);
- while (i + 1 < (int)events.size() && events[i].first == events[i + 1].first) {
- ++i;
- update(events[i].second);
- }
- // debug(getMin(), event.first);
- // if (event.first == 1) {
- // for (int i = 1; i < 2 * base; ++i) {
- // cout << i << " :: " << tree[i].w[0] << " " << tree[i].w[1] << " " << tree[i].w[2] << " " << tree[i].w[3] << endl;
- // }
- // }
- res = min(res, getMin() * (LL)r + (LL)event.first * (LL)c);
- }
- cout << res << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement