제출 #1176661

#제출 시각아이디문제언어결과실행 시간메모리
1176661ASN49KSparklers (JOI17_sparklers)C++20
30 / 100
2021 ms16892 KiB
#include <bits/stdc++.h>
#define all(x) x.begin(),x.end()
const int inf=1e9;
using i64 = long long;
#define int long long

struct interval
{
    int l,r;
};


std::vector<interval> add_range(std::vector<interval> a,int k)
{
    std::vector<interval>rez;
    std::map<int,int>mp;
    for(auto &c:a)
    {
        mp[c.l-k]++;
        mp[c.r+k+1]--;
    }

    int last=-1,sum=0;
    for(auto &c:mp)
    {
        if(sum==0)
        {
            last=c.first;
        }
        sum+=c.second;
        if(sum==0)
        {
            rez.push_back({last , c.first-1});
        }
    }
    return rez;
}
std::vector<interval> unite(std::vector<interval>a,std::vector<interval> b)
{
    std::vector<interval>rez;
    std::map<int,int>mp;
    for(auto &c:a)
    {
        mp[c.l]++;
        mp[c.r+1]--;
    }
    for(auto &c:b)
    {
        mp[c.l]++;
        mp[c.r+1]--;
    }

    int last=-1,sum=0;
    for(auto &c:mp)
    {
        if(sum==0)
        {
            last=c.first;
        }
        sum+=c.second;
        if(sum==0)
        {
            rez.push_back({last , c.first-1});
        }
    }
    return rez;
}

std::vector<interval> intersect(std::vector<interval>a,std::vector<interval> b)
{
    std::vector<interval>rez;
    std::map<int,int>mp;
    for(auto &c:a)
    {
        mp[c.l]++;
        mp[c.r+1]--;
    }
    for(auto &c:b)
    {
        mp[c.l]++;
        mp[c.r+1]--;
    }

    int last=-1,sum=0;
    for(auto &c:mp)
    {
        int last_sum=sum;
        sum+=c.second;
        if(last_sum<2 && sum==2)
        {
            last=c.first;
        }
        if(sum<2 && last_sum==2)
        {
            rez.push_back({last,c.first-1});
        }
    }
    return rez;
}
main()
{
    int n,k,t;
    std::cin>>n>>k>>t;
    k--;

    std::vector<int>a(n);
    for(auto &c:a)
    {
        std::cin>>c;
    }
    auto test=[&](int s)->bool
    {
        std::vector<std::vector<std::vector<interval>>>dp(n,std::vector<std::vector<interval>>(n));
        dp[k][k]={{a[k],a[k]}};
        for(int l=n-1;l>=0;l--)
        {
            for(int r=l+1;r<n;r++)
            {
                auto ll=intersect(add_range(dp[l][r-1],t*s) , {{a[r]-(r-l)*t*s,a[r]+(r-l)*t*s}});
                auto rr=intersect(add_range(dp[l+1][r],t*s) , {{a[l]-(r-l)*t*s,a[l]+(r-l)*t*s}});
                dp[l][r]=unite(ll , rr);
                assert(dp[l][r].size()<=1);
            }
        }

        return dp[0][n-1].size()>0;
    };
    int st=0,dr=a.back(),rez=-1;
    while(st<=dr)
    {
        int mid=(st+dr)/2;
        if(test(mid))
        {
            dr=mid-1;
            rez=mid;
        }
        else
        {
            st=mid+1;
        }
    }
    assert(rez!=-1);

    std::cout<<rez;
    return 0;
}
/*
2 1 10
200
300
*/

컴파일 시 표준 에러 (stderr) 메시지

sparklers.cpp:100:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  100 | main()
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...