Submission #881263

#TimeUsernameProblemLanguageResultExecution timeMemory
881263vjudge1Holiday (IOI14_holiday)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N=3e5, inf = 1e18;
int f[N+1], fr[N+1], g[N+1], gl[N+1];
int a[N+1], n, start, d, id[N+1], pos[N+1];

struct segtree
{
    int val=0, cnt=0;
    int low, hi;
    segtree* l;
    segtree* r;
    void init(int __low, int __hi)
    {
        val=0, cnt=0;
        low=__low;
        hi=__hi;
        int mid =low+hi>>1;
        if(low!=hi)
        {
            l= new segtree;
            r=  new segtree;
            l->init(low, mid);
            r->init(mid+1, hi);
        }
    }
    void update(int i, int k, int t)
    {
        if(low==hi)
        {
            val+=k, cnt+=t;
            return;
        }
        int mid=low+hi>>1;
        if(i<=mid) l->update(i,k,t);
        else r->update(i,k,t);
        val=l->val+r->val;
        cnt=l->cnt+r->cnt;
    }
    int get(int k)
    {
        if(low==hi)
        {
            if(k>0) return val;
            else return 0;
        }
        if(r->cnt>=k) return r->get(k);
        else return r->val + l->get(k-r->cnt);
    }

}base;

void dnaf(int l, int r, int mn, int mx, int st)
{
    if(l>r) return;
    int mid=l+r>>1;
    //cout << mid << " " <<l << " " << r <<" " << mn << " " << mx << '\n';
    //cout << base.val << '\n';
    for(int i=mn;i<=min(st+mid,mx);++i)
    {
        base.update(pos[i], a[i], 1);
       // cout << base.val << " ";
        int cnt = mid-(i-st);
        int k = base.get(cnt);
        if(k>f[mid])
        {
            f[mid]=k;
            fr[mid]=i;
        }
    }
   // cout << '\n';
   // cout << fr[mid] << " " << f[mid] << '\n' << '\n';
    for(int i = min(st+mid,mx); i>=fr[mid];--i) base.update(pos[i], -a[i], -1);
    dnaf(mid+1,r, fr[mid], mx, st);
    for(int i=mn;i<fr[mid];++i) base.update(pos[i], -a[i], -1);
    dnaf(l,mid-1, mn, fr[mid], st);
}

void dnag(int l, int r, int mx, int mn, int st)
{
    if(l>r) return;
    int mid=l+r>>1;
    //cout << mid << " " <<l << " " << r <<" " << mn << " " << mx << '\n';
    //cout << base.val << '\n';
    for(int i=mx;i>=max(st-mid,mn);--i)
    {
        base.update(pos[i], a[i], 1);
        //cout << base.val << " ";
        int cnt = mid-(st-i);
        int k = base.get(cnt);
        if(k>g[mid])
        {
            g[mid]=k;
            gl[mid]=i;
        }
    }
    //cout << '\n';
    //cout << gl[mid] << " " << g[mid] << '\n' << '\n';
    for(int i = max(st-mid,mn); i<=gl[mid];++i) base.update(pos[i], -a[i], -1);
    dnag(l,mid-1, gl[mid], mn, st);
    for(int i=mx;i>gl[mid];--i) base.update(pos[i], -a[i], -1);
    dnag(mid+1,r, mx, gl[mid], st);
}

bool ss(int x, int y)
{
    return a[x]<a[y];
}

int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> start >> d;
    start++;
    for(int i=1;i<=n;++i)
    {
        cin >> a[i];
        id[i]=i;
    }
    base.init(1, n);
    sort(id+1,id+n+1, ss);
    for(int i=1;i<=n;++i)
    {
        pos[id[i]]=i;
    }
    dnaf(0, d, start, n, start);
   // for(int i=0;i<=d;++i) cout << i << " " << fr[i] << " " << f[i] << '\n';
    //cout << base.val << '\n';
    base.init(1,n);
   // cout << "L";
    dnag(0, d, start-1, 1, start-1);
   // cout << '\n';
   // for(int i=0;i<=d;++i) cout << i << " " << gl[i] << " " << g[i] << '\n';
    int ans=0;
    for(int i=0;i<=d;++i)
    {
        ans = max(ans, f[i] + g[d-i-(fr[i]-start+1)]);
    }
    fill(g,g+d+1,0);
    fill(f,f+d+1,0);
    fill(gl,gl+d+1,0);
    fill(fr,fr+d+1,0);
    base.init(1,n);
    dnag(0, d, start, 1, start);
    base.init(1,n);
    dnaf(0, d, start+1, n, start+1);
    for(int i=0;i<=d;++i)
    {
        ans = max(ans, g[i] + f[d-i-(start+1-gl[i])]);
    }
    cout << ans;

}

Compilation message (stderr)

holiday.cpp: In member function 'void segtree::init(long long int, long long int)':
holiday.cpp:20:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   20 |         int mid =low+hi>>1;
      |                  ~~~^~~
holiday.cpp: In member function 'void segtree::update(long long int, long long int, long long int)':
holiday.cpp:36:20: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   36 |         int mid=low+hi>>1;
      |                 ~~~^~~
holiday.cpp: In function 'void dnaf(long long int, long long int, long long int, long long int, long long int)':
holiday.cpp:58:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   58 |     int mid=l+r>>1;
      |             ~^~
holiday.cpp: In function 'void dnag(long long int, long long int, long long int, long long int, long long int)':
holiday.cpp:84:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   84 |     int mid=l+r>>1;
      |             ~^~
/usr/bin/ld: /tmp/cciZVgQY.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/cciF7IMY.o:holiday.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/cciZVgQY.o: in function `main':
grader.cpp:(.text.startup+0xaf): undefined reference to `findMaxAttraction(int, int, int, int*)'
collect2: error: ld returned 1 exit status