제출 #98068

#제출 시각아이디문제언어결과실행 시간메모리
98068SmelskiyJakarta Skyscrapers (APIO15_skyscraper)C++14
0 / 100
9 ms2816 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define ff first
#define ss second
#define pb push_back
#define mp make_pair

const int N = 30000 + 11;
const int MAX = 2e9;
const int T = 1;

int dist[N],a[N],b[N];
bool use[N];
vector<int> v[N];
set<pair<int,int> > s[T+11];
int distt[T+11][N];
set<pair<int,int> > st;

void ups(int d, int l, int p)
{
    if (dist[l]>p)
    {
        st.erase(mp(dist[l],l));
        dist[l]=p;
        st.insert(mp(dist[l],l));
    }
    if (distt[d][l]>p)
    {
        s[d].erase(mp(distt[d][l],l));
        distt[d][l]=p;
        s[d].insert(mp(distt[d][l],l));
    }
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #ifndef __WIN32
        freopen("game.in", "r", stdin);
        freopen("game.out", "w", stdout);
    #endif // __WIN32
    int n,m;
    cin>>n>>m;
    int tt=0;
    for (int i=1; i<=m; i++)
    {
        cin>>a[i]>>b[i];
        a[i]++;
        v[a[i]].pb(b[i]);
        if (i==2) tt=a[i];
    }
    for (int p=1; p<=T; p++)
    {
        for (int i=1; i<=n; i++)
        {
            dist[i]=MAX;
            distt[p][i]=MAX;
        }
    }
    dist[a[1]]=0;
    st.insert(mp(0,a[1]));
    for (int ii=1; ii<=n; ii++)
    {
        for (int d=1; d<=T; d++)
            while (s[d].size()>0)
        {
            pair<int,int> pp=*s[d].begin();
            int to=pp.ss;
            if (use[to]==1)
            {
                s[d].erase(mp(distt[d][to],to));
                if (to-d>=1)
                    ups(d,to-d,distt[d][to]+1);
                if (to+d<=n)
                    ups(d,to+d,distt[d][to]+1);
            } else break;
        }
        pair<int,int> p=*st.begin();
        st.erase(p);
        int l=p.ss;
        for (int t=0; t<v[l].size(); t++)
        {
            int x=v[l][t];
            if (x>T)
            {
                for (int c=1; l+x*c<=n; c++)
                    if (dist[l+x*c]>dist[l]+c)
                {
                    int to=l+x*c;
                    ups(0,to,dist[l]+c);
                }
                for (int c=1; l-x*c>=1; c++)
                    if (dist[l-x*c]>dist[l]+c)
                {
                    int to=l-x*c;
                    ups(0,to,dist[l]+c);
                }
            } else
            {
                ups(x,l,dist[l]);
            }
        }
        use[l]=1;
    }
    if (dist[tt]==MAX) cout<<-1<<endl;
    else cout<<dist[tt]<<endl;
}

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

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:83:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int t=0; t<v[l].size(); t++)
                       ~^~~~~~~~~~~~
skyscraper.cpp:41:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen("game.in", "r", stdin);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
skyscraper.cpp:42:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen("game.out", "w", stdout);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...