답안 #713485

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
713485 2023-03-22T09:17:35 Z SlavicG Sails (IOI07_sails) C++17
25 / 100
53 ms 23780 KB
#include "bits/stdc++.h"
using namespace std;
 
#define ll long long
 
#define          all(v)              v.begin(), v.end()
#define         rall(v)              v.rbegin(),v.rend()
 
#define            pb                push_back
#define          sz(a)               (int)a.size()
 
#define int long long
 
const int N = 1e5 + 10;
int lazy[4 * N];
struct node {
    int mn, last_min, mx, first_min;
} t[4 * N];
 
void push(int i, int l, int r) {
    if(!lazy[i]) return;
    t[i].mn += lazy[i];
    t[i].mx += lazy[i];
    if(l != r) {
        lazy[2 * i] += lazy[i];
        lazy[2 * i + 1] += lazy[i];
    }
    lazy[i] = 0;
}
node merge(node a, node b) {
    node c;
    c.mn = min(a.mn, b.mn);
    c.mx = max(a.mx, b.mx);
    if(a.mn < b.mn) c.last_min = a.last_min, c.first_min = a.first_min;
    else c.last_min = b.last_min, c.first_min = b.first_min;
    if(a.mn == b.mn) {
        c.first_min = min(a.first_min, b.first_min);
        c.last_min = max(a.last_min, b.last_min);
    }
    return c;
}
void modif(int i, int l, int r, int tl, int tr, int val) {
    push(i, l, r);
    if(l > tr || r < tl) return;
    if(l >= tl && r <= tr) {
        lazy[i] += val;
        push(i, l, r);
        return;
    }
    int mid = l + r >> 1;
    modif(2 * i, l, mid, tl, tr, val);
    modif(2 * i + 1, mid + 1, r, tl, tr, val);
    t[i] = merge(t[2 * i], t[2 * i + 1]);
}
node query(int i, int l, int r, int tl, int tr) {
    push(i, l, r);
    if(l > tr || r < tl) return {INT_MAX, -1, -1, INT_MAX};
    if(l >= tl && r <= tr) return t[i];
    int mid = l + r >> 1;
    return merge(query(2 * i, l, mid, tl, tr), query(2 * i + 1, mid + 1, r, tl, tr));
}
void build(int i, int l, int r) {
    if(l > r) return;
    if(l == r) {
        t[i].mn = 0;
        t[i].last_min = l;
        t[i].first_min = l;
        t[i].mx = 0;
        return;
    }
    int mid = l + r >> 1;
    build(2 * i, l, mid);
    build(2 * i + 1, mid + 1, r);
    t[i] = merge(t[2 * i], t[2 * i + 1]);
}
void solve() {
    int n; cin >> n;
    vector<pair<int, int>> a(n);
    for(int i = 0; i < n; ++i) {
        cin >> a[i].first >> a[i].second;
    }
    vector<int> cnt((int)1e5 + 5, 0);
    ll ans = 0;
    sort(rall(a));
    build(1, 0, N - 1);
    for(int i = n - 1; i >= 0; --i) {
        vector<pair<int, int>> v;
        int cnt = 0;
        while(a[i].second) {
            assert(++cnt <= 20);
            node root = query(1, 0, N - 1, 1, a[i].first);
            int DOWN = root.first_min;
            int UP = min({DOWN + a[i].second - 1, a[i].first, root.last_min});
            ans += root.mn * (UP - DOWN + 1);
            v.pb({DOWN, UP});
            modif(1, 0, N - 1, DOWN, UP, (int)1e5 + 5);
            a[i].second -= UP - DOWN + 1;
        }
        for(auto x: v) {
            modif(1, 0, N - 1, x.first, x.second, -(int)(1e5 + 4));
        }
    }
    cout << ans << '\n';
}   
 
int32_t main() {
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t = 1;
    //cin >> t;
    while(t--) {
        solve();
    }
}

Compilation message

sails.cpp: In function 'void modif(long long int, long long int, long long int, long long int, long long int, long long int)':
sails.cpp:50:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   50 |     int mid = l + r >> 1;
      |               ~~^~~
sails.cpp: In function 'node query(long long int, long long int, long long int, long long int, long long int)':
sails.cpp:59:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   59 |     int mid = l + r >> 1;
      |               ~~^~~
sails.cpp: In function 'void build(long long int, long long int, long long int)':
sails.cpp:71:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   71 |     int mid = l + r >> 1;
      |               ~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 9300 KB Output is correct
2 Correct 6 ms 9300 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 9300 KB Output is correct
2 Correct 5 ms 9300 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 9300 KB Output is correct
2 Correct 5 ms 9300 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 15 ms 18760 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 15 ms 18908 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 17 ms 19412 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 23 ms 19692 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 32 ms 20356 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 44 ms 23780 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 36 ms 21576 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 53 ms 22320 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -