답안 #435863

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
435863 2021-06-23T20:12:50 Z Bench0310 사탕 분배 (IOI21_candies) C++17
8 / 100
3360 ms 84136 KB
#include <bits/stdc++.h>
#include "candies.h"

using namespace std;
typedef long long ll;

const ll inf=(1ll<<60);

struct obj
{
    ll sum;
    ll mn;
    ll mn_idx;
    ll mx;
    ll mx_idx;
    obj(){sum=0;mn=inf;mx=-inf;mn_idx=mx_idx=-3;}
    obj(ll x,int idx=-3){sum=mn=mx=x;mn_idx=mx_idx=idx;}
};

obj tmerge(obj a,obj b)
{
    obj r=a;
    r.sum+=b.sum;
    if(a.sum+b.mn<r.mn)
    {
        r.mn=a.sum+b.mn;
        r.mn_idx=b.mn_idx;
    }
    if(a.sum+b.mx>r.mx)
    {
        r.mx=a.sum+b.mx;
        r.mx_idx=b.mx_idx;
    }
    return r;
}

const int N=200005;
int n;
vector<ll> c(N);
vector<ll> mv(N);
vector<int> queries[4*N];
vector<obj> tree(4*N);
vector<ll> res(N);

int mid(int l,int r){return (l+r)/2-((l+r)<0&&((l+r)&1));}

void add_query(int idx,int l,int r,int ql,int qr,int x)
{
    if(ql>qr) return;
    if(l==ql&&r==qr) queries[idx].push_back(x);
    else
    {
        int m=mid(l,r);
        add_query(2*idx,l,m,ql,min(qr,m),x);
        add_query(2*idx+1,m+1,r,max(ql,m+1),qr,x);
    }
}

void update(int idx,int l,int r,int pos,obj o)
{
    if(l==r) tree[idx]=o;
    else
    {
        int m=mid(l,r);
        if(pos<=m) update(2*idx,l,m,pos,o);
        else update(2*idx+1,m+1,r,pos,o);
        tree[idx]=tmerge(tree[2*idx],tree[2*idx+1]);
    }
}

bool ok(obj o,ll val){return (o.mx-o.mn)>=val;}

obj descend(int idx,int l,int r,ll val,obj req=obj())
{
    if(l==r) return tmerge(tree[idx],req);
    int m=mid(l,r);
    if(ok(tmerge(tree[2*idx+1],req),val)==1) return descend(2*idx+1,m+1,r,val,req);
    else return descend(2*idx,l,m,val,tmerge(tree[2*idx+1],req));
}

ll query(int idx,int l,int r,int ql,int qr)
{
    if(ql>qr) return 0;
    if(l==ql&&r==qr) return tree[idx].sum;
    int m=mid(l,r);
    return query(2*idx,l,m,ql,min(qr,m))+query(2*idx+1,m+1,r,max(ql,m+1),qr);
}

void solve(int idx,int l,int r)
{
    for(int x:queries[idx]) update(1,-2,n-1,x,obj(mv[x],x));
    if(l==r)
    {
        obj o=descend(1,-2,n-1,c[l]);
        if(o.mn_idx<o.mx_idx) res[l]=c[l]+query(1,-2,n-1,o.mx_idx+1,n-1);
        else res[l]=query(1,-2,n-1,o.mn_idx+1,n-1);
    }
    else
    {
        int m=mid(l,r);
        solve(2*idx,l,m);
        solve(2*idx+1,m+1,r);
    }
    for(int x:queries[idx]) update(1,-2,n-1,x,obj());
}

vector<int> distribute_candies(vector<int> nc,vector<int> nl,vector<int> nr,vector<int> nv)
{
    n=nc.size();
    for(int i=0;i<n;i++) c[i]=nc[i];
    int q=nl.size();
    for(int i=0;i<q;i++)
    {
        mv[i]=nv[i];
        add_query(1,0,n-1,nl[i],nr[i],i);
    }
    update(1,-2,n-1,-2,obj(inf,-2));
    update(1,-2,n-1,-1,obj(-inf,-1));
    solve(1,0,n-1);
    vector<int> r(n);
    for(int i=0;i<n;i++) r[i]=res[i];
    return r;
}

//int main()
//{
//    int n;
//    cin >> n;
//    vector<int> nc(n);
//    for(int i=0;i<n;i++) cin >> c[i];
//    int q;
//    cin >> q;
//    vector<int> l(q),r(q),v(q);
//    for(int i=0;i<q;i++) cin >> l[i] >> r[i] >> v[i];
//    vector<int> x=distribute_candies(nc,l,r,v);
//    for(int i=0;i<n;i++) cout << x[i] << " \n"[i==n-1];
//    return 0;
//}
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 54988 KB Output is correct
2 Correct 27 ms 55056 KB Output is correct
3 Incorrect 33 ms 55140 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3251 ms 84056 KB Output is correct
2 Correct 3349 ms 84084 KB Output is correct
3 Correct 3360 ms 84136 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 55116 KB Output is correct
2 Incorrect 653 ms 69720 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 54988 KB Output is correct
2 Correct 30 ms 55092 KB Output is correct
3 Incorrect 140 ms 60968 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 54988 KB Output is correct
2 Correct 27 ms 55056 KB Output is correct
3 Incorrect 33 ms 55140 KB Output isn't correct
4 Halted 0 ms 0 KB -