답안 #713364

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
713364 2023-03-21T20:00:18 Z SlavicG Sails (IOI07_sails) C++17
30 / 100
1000 ms 10440 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;
} 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;
    else c.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};
    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].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;
        while(a[i].second) {
            node root = query(1, 0, N - 1, 1, a[i].first);
            int UP = root.last_min;
            int l = 1, r = UP, DOWN = -1;
            while(l <= r) {
                int mid = l + r >> 1;
                if(query(1, 0, N - 1, mid, UP).mx != root.mn) {
                    l = mid + 1;
                } else {
                    DOWN = max(mid, UP - a[i].second + 1);
                    r = mid - 1;
                }
            } 
            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:46:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   46 |     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:55:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   55 |     int mid = l + r >> 1;
      |               ~~^~~
sails.cpp: In function 'void build(long long int, long long int, long long int)':
sails.cpp:66:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   66 |     int mid = l + r >> 1;
      |               ~~^~~
sails.cpp: In function 'void solve()':
sails.cpp:88:29: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   88 |                 int mid = l + r >> 1;
      |                           ~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 7252 KB Output is correct
2 Correct 3 ms 7252 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 7252 KB Output is correct
2 Correct 6 ms 7252 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 7252 KB Output is correct
2 Correct 4 ms 7252 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 7252 KB Output is correct
2 Correct 127 ms 7364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1082 ms 7524 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1050 ms 7784 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1069 ms 7808 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1070 ms 8120 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1074 ms 10440 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1067 ms 8740 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1068 ms 9164 KB Time limit exceeded
2 Halted 0 ms 0 KB -