Pages

test 35


  IN C++



TEST - 35


#include<bits/stdc++.h>
using namespace std;

typedef long long int ll;

void solve()
{
    ll N,M;
    ll x,prefix=0,maxim=0;
    cin>>N>>M;
    set<ll> S;
    S.insert(0);
    for(int i=1;i<=N;i++){
        cin>>x;
        prefix = (prefix + x)%M;
        maxim = max(maxim,prefix);
        set<ll>::iterator  it = S.lower_bound(prefix+1);
        if( it != S.end() ){
            maxim = max(maxim,prefix - (*it) + M );
        }
        S.insert(prefix);
    }
    cout<<maxim<<endl;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)    solve();
    return 0;
}



Maximizing Mission Points




#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int const N = 800600;
ll const INFL = 1e18 + 111;

struct Item {
    int x, y, h;
    ll cost;
};

struct Max {
    vector<pair<ll, ll>> a, b;
    
    Max() {
        clear();
    }
    
    void clear() {
        a.clear();
        a.emplace_back(-INFL, -INFL);
        b.clear();
        b.emplace_back(-INFL, -INFL);
    }
    
    void add(ll x) {
        a.emplace_back(x, max(a.back().second, x));
    }
    
    ll get_max() const {
        return max(a.back().second, b.back().second);
    }
    
    void pop() {
        if (b.size() == 1u) {
            while (a.size() > 1u) {
                b.emplace_back(a.back().first, max(a.back().first, b.back().second));
                a.pop_back();
            }
        }
        b.pop_back();
        assert(a.size() >= 1u);
        assert(b.size() >= 1u);
    }
};

int n, dx, dy;
Item items[N];
ll ans[N];
Max leafs[N];
ll tree[N];

void build(int v, int l, int r) {
    tree[v] = -INFL;
    if (r - l > 1) {
        int m = (l + r) / 2;
        build(2 * v + 1, l, m);
        build(2 * v + 2, m, r);
    } else {
        leafs[l].clear();
    }
}

void add_number(int v, int l, int r, int pos, ll num) {
    if (r - l == 1) {
        if (num == INFL)
            leafs[l].pop();
        else
            leafs[l].add(num);
        tree[v] = leafs[l].get_max();
    } else {
        int m = (l + r) / 2;
        if (pos < m)
            add_number(2 * v + 1, l, m, pos, num);
        else
            add_number(2 * v + 2, m, r, pos, num);
        tree[v] = max(tree[2 * v + 1], tree[2 * v + 2]);
    }
}

ll get_max(int v, int l, int r, int from, int to) {
    if (r <= from || to <= l)
        return -INFL;
    if (from <= l && r <= to)
        return tree[v];
    int m = (l + r) / 2;
    return max(get_max(2 * v + 1, l, m, from, to), get_max(2 * v + 2, m, r, from, to));
}

struct Event {
    int x, y1, y2, type, i; /// -1 - open, 0 - point, 1 - close
};

bool operator<(Event const& e1, Event const& e2) {
    if (e1.x != e2.x)
        return e1.x < e2.x;
    return e1.type < e2.type;
}

void go(int L, int R) {
    if (R - L == 1) {
    } else {
        int M = (L + R) / 2;
        go(L, M);
        static int ally[N];
        int cn = 0;
        for (int i = L; i < M; ++i) {
            ally[cn++] = items[i].y;
        }
        sort(ally, ally + cn);
        cn = unique(ally, ally + cn) - ally;
        #define comp(q) (lower_bound(ally, ally + cn, q) - ally)
        static Event events[N];
        int es = 0;
        for (int i = L; i < M; ++i) {
            int q = comp(items[i].y);
            events[es++] = {items[i].x - dx, q, -1, -1, i};
            events[es++] = {items[i].x + dx, q, -1, 1, i};
        }
        for (int i = M; i < R; ++i) {
            int from = comp(items[i].y - dy);
            int to = comp(items[i].y + dy + 1);
            events[es++] = {items[i].x, from, to, 0, i};
        }
        build(0, 0, cn);
        sort(events, events + es);
        for (int i = 0; i < es; ++i) {
            auto e = events[i];
            if (e.type == -1) {
                add_number(0, 0, cn, e.y1, ans[e.i]);
            } else if (e.type == 1) {
                add_number(0, 0, cn, e.y1, INFL);
            } else {
                ll cur = get_max(0, 0, cn, e.y1, e.y2) + items[e.i].cost;
                ans[e.i] = max(ans[e.i], cur);
            }
        }
        go(M, R);
    }
}

bool solve() {
    if (scanf("%d%d%d", &n, &dx, &dy) < 0) {
        return false;
    }
    assert(n >= 1 && n <= 200000);
    assert(dx >= 1 && dx <= 200000);
    assert(dy >= 1 && dy <= 200000);
    for (int i = 0; i < n; ++i) {
        int x, y, h, cost;
        scanf("%d%d%d%d", &x, &y, &h, &cost);
        assert(x >= 1 && x <= 200000);
        assert(y >= 1 && y <= 200000);
        assert(h >= 1 && h <= 200000);
        assert(cost >= -200000 && cost <= 200000);
        items[i] = {x, y, h, (ll)cost};
    }
    sort(items, items + n, [](Item const &a, Item const &b) {
        return a.h < b.h;
    });
    for (int i = 0; i < n; ++i) {
        ans[i] = items[i].cost;
    }
    go(0, n);
    ll res = 0;
    for (int i = 0; i < n; ++i) {
        res = max(res, ans[i]);
    }
    cout << res << '\n';
    return true;
}

int main() {
    while (solve());
}



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



Making Candies





#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

bool check(ll machines, ll workers, ll price, ll target, ll rounds) {
    if (machines >= (target+workers-1)/workers) return true;
    ll cur = machines*workers;
    rounds--;
    if (rounds == 0) return false;
    while (1) {
        ll rem = target - cur;
        ll rnds = (rem + machines*workers - 1) / (machines*workers);
        if (rnds <= rounds) return true;
        if (cur < price) {
          rem = price - cur;
          rnds = (rem + machines*workers - 1) / (machines*workers);
          rounds -= rnds;
          if (rounds < 1) return false;
          cur += rnds * machines * workers;
        }
        cur -= price;
        if (machines > workers) {
          workers++;
        } else {
          machines++;
        }
    }
    return false;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll m, w, p, n;
    cin >> m >> w >> p >> n;
    ll a = 1, b = 1000000000000LL;
    while (a < b) {
        ll mid = (a + b) >> 1;
        if (check(m, w, p, n, mid)) {
          b = mid;
        } else {
          a = mid + 1;
        }
    }
    cout << a << "\n";
    return 0;
}

Anonymous