Submission #1082880

#TimeUsernameProblemLanguageResultExecution timeMemory
1082880phongHoliday (IOI14_holiday)C++17
Compilation error
0 ms0 KiB
#include<bits/stdc++.h>

#define ll long long
#define int long long
const int nmax = 2e5 + 5, N = 1e5;
const ll oo = 1e18 + 1, base = 311;
const int lg = 15, M = 10;
const ll mod = 998244353, mod2 = 1e9 + 5277;
#define pii pair<int, int>
#define fi first
#define se second
#define endl "\n"
#define debug(a, n) for(int i = 1; i <= n; ++i) cout << a[i] << ' '; cout << "\n";
using namespace std;

int n, m;
pii a[nmax];
ll best[nmax];
multiset<pii> one, two;
struct node{
    int l, r, from, to;
};
vector<node> adj[50];
ll pre[nmax], suf[nmax];
int el[nmax];
pii b[nmax];
struct hos{
    int cnt, w;
}tree[nmax << 2];
void update(int id, int l, int r, int u, int idx){
    if(l > u || r < u) return;
    if(l >= u && r <= u){
        if(idx){
            tree[id].cnt = 1;
            tree[id].w = b[l].fi;
            return;
        }
        else {
            tree[id].cnt = 0;
            tree[id].w = 0;
            return;
        }
    }
    int mid= r + l >> 1;
    update(id << 1, l, mid, u, idx);
    update(id << 1 | 1, mid + 1, r, u, idx);
    tree[id].cnt = tree[id << 1].cnt + tree[id << 1 | 1].cnt;
    tree[id].w = tree[id << 1].w + tree[id << 1 | 1].w;
}
int get(int id, int l, int r, int u, int v, int k){
    if(tree[id].cnt <= k) return tree[id].w;
    int mid = r + l >> 1;
    if(mid < u) return get(id << 1 | 1, mid + 1, r, u, v, k);
    if(mid + 1 > v) return get(id << 1, l, mid, u, v, k);
    if(k <= tree[id << 1].cnt) return get(id << 1, l, mid, u, v, k);
    return tree[id << 1].w + get(id << 1 | 1, mid + 1, r, u,v, k - tree[id << 1].cnt);
}

main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
//    freopen("code.inp", "r", stdin);
//    freopen("code.out", "w", stdout);
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) cin >> a[i].fi >> a[i].se;
    sort(a + 1, a + 1 + n, [](pii a, pii b){
        return a.se < b.se;
         });
    for(int i = 1; i <= n; ++i) b[i] = {a[i].fi, i};
    sort(b + 1, b + 1 + n, [](pii a, pii b){
        return a.fi > b.fi;
         });
    for(int i = 1; i <= n; ++i) el[b[i].se] = i;
    pre[0] = suf[n + 1] = -oo;
    for(int i = 1; i <= n; ++i){
        pre[i] = max(pre[i - 1], a[i].fi + 2 * a[i].se);
    }
//    cout << pre[1] << ' ';
    for(int i = n; i >= 1; --i){
        suf[i] = max(suf[i + 1], a[i].fi - 2 * a[i].se);
    }
    adj[1].push_back({1, n, 1, n});
    ll ans = -oo;
    for(int e = 1; e <= 20; ++e){
        if(adj[e].empty()) continue;
        int pos = 1, pre_pos = 1;
        ll cur = 0;
        for(int i = 1; i <= n; ++i) update(1, 1, n, i, 0);
        for(auto [l, r, from, to] : adj[e]){
            int mid = r + l >> 1;
            auto &p = best[mid];
            p = to;
            int ma = -oo;
            for(int i = from; i <= to; ++i){
                if(i - mid + 1 < m) continue;
                while(pos < i){
                    update(1, 1, n, el[pos], 1);
                    ++pos;
                }
                while(pre_pos <= mid){
                    update(1, 1, n, el[pre_pos], 0);
                    ++pre_pos;
                }
                ll res = pre[mid] + suf[i] + get(1, 1, n, 1, n, m - 2);
//                cout << res << ' ';
                if(ma < res){
                    ma = res;
                    p = i;
                    ans = max(ans, ma);
                }
            }
            if(l < mid) adj[e + 1].push_back({l, mid - 1, from, p});
            if(mid < r) adj[e + 1].push_back({mid + 1, r, p, to});
        }
    }
//    debug(best, n);
    cout << ans;
}
/*
5 4
1 2
2 3
3 4
3 5
1 2 1 3 4


*/

Compilation message (stderr)

holiday.cpp: In function 'void update(long long int, long long int, long long int, long long int, long long int)':
holiday.cpp:44:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   44 |     int mid= r + l >> 1;
      |              ~~^~~
holiday.cpp: In function 'long long int get(long long int, long long int, long long int, long long int, long long int, long long int)':
holiday.cpp:52:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   52 |     int mid = r + l >> 1;
      |               ~~^~~
holiday.cpp: At global scope:
holiday.cpp:59:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   59 | main(){
      | ^~~~
holiday.cpp: In function 'int main()':
holiday.cpp:90:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   90 |             int mid = r + l >> 1;
      |                       ~~^~~
holiday.cpp:87:12: warning: unused variable 'cur' [-Wunused-variable]
   87 |         ll cur = 0;
      |            ^~~
/usr/bin/ld: /tmp/cccYF6CA.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/cc0CHnWC.o:holiday.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/cccYF6CA.o: in function `main':
grader.cpp:(.text.startup+0xaf): undefined reference to `findMaxAttraction(int, int, int, int*)'
collect2: error: ld returned 1 exit status