Submission #485885

#TimeUsernameProblemLanguageResultExecution timeMemory
485885rumen_mDungeons Game (IOI21_dungeons)C++17
100 / 100
3647 ms279092 KiB
#include "dungeons.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;
const long long maxn = 400005;
const long long logn = 24;
const long long INF = 1e18;
const int C = 3000;
int where[logn];
long long nextt[maxn][logn],add[maxn][logn],treshold[maxn][logn];
long long sums[maxn],maxs[maxn];
bool vis[maxn];
long long n;
vector <long long> s,p,w,l;

long long dfs(long long v)
{
    if(v==n)return 0;
    if(vis[v])return sums[v];
    sums[v] = s[v] + dfs(w[v]);
    maxs[v]  =max(s[v],maxs[w[v]]);
    vis[v] = 1;
    return sums[v];
}
void init(int _n, std::vector<int> _s, std::vector<int> _p, std::vector<int> _w, std::vector<int> _l) {
	long long i,j;
	n = _n;
	s.resize(_s.size());
	for(i=0;i<_s.size();i++)
        s[i]  = _s[i];
    p.resize(_p.size());
	for(i=0;i<_p.size();i++)
        p[i]  = _p[i];
        w.resize(_w.size());
	for(i=0;i<_w.size();i++)
        w[i]  = _w[i];
        l.resize(_l.size());
	for(i=0;i<_l.size();i++)
        l[i]  = _l[i];




            for(i=0;i<n;i++)
            {


                if(s[i]<=C)
                {
                    nextt[i][0] = w[i];
                    add[i][0] = s[i];
                    treshold[i][0]= INF;

                }
                else
                {
                    nextt[i][0] = l[i];
                    add[i][0]= p[i];
                    treshold[i][0] = s[i];

                }
            }
            nextt[n][0]  = n;
            treshold[n][0] = INF;//cout<<t<<endl;
            for(i=1;i<logn;i++)
            {
                for(j=0;j<=n;j++)
                {
                    nextt[j][i]= nextt[nextt[j][i-1]][i-1];
                    add[j][i] = add[j][i-1]+add[nextt[j][i-1]][i-1];
                    treshold[j][i] = max((long long)0,min(treshold[j][i-1],treshold[nextt[j][i-1]][i-1]-add[j][i-1]));
                 //   cout<<j<<" "<<i<<" "<<t<<" -> "<<nextt[j][i][t]<<" "<<add[j][i][t]<<" "<<treshold[j][i][t]<<endl;
                }
            }


    for(i=0;i<=n;i++)
    {
        dfs(i);
    }
}

long long simulate(int _x, int _z) {

    long long x = _x;
    long long z = _z;
    while(z <= C)
    {
        if(x==n)return z;
        if(z>=s[x])
        {
            z+=s[x];
            x = w[x];
        }
        else
        {
            z+=p[x];
            x = l[x];
        }
    }
	if(x==n)return z;// cout<<"&&"<<n<<endl;
	int i;

       // cout<<x<<" "<<z<<endl;
        bool fl = true;
        while(fl)
        {
            fl=0;

            for(i = logn-1; i>=0;i--)
            {
              //  cout<<i<<" curr: "<<x<<" "<<z<<endl;
                if(x==n)return z;
                if(treshold[x][i]>z)
                {
                    z += add[x][i];
                    x = nextt[x][i];
                    fl = true;
                    break;
                }
            }
            if(x==n)return z;
              if(z>=s[x])
        {
            z+=s[x];
            x = w[x];
        }
        else
        {
            z+=p[x];
            x = l[x];
        }
        if(x==n)return z;
        fl = true;
       if(maxs[x]<=z)
        {
            z+=sums[x];
            return z;
        }
        }
           // cout<<"predi last: "<<x<<" "<<z<<endl;
            if(x==n)return z;

               if(s[x]>z)
               {
                   z+=p[x];
                   x = l[x];
               }
               else
               {
                   z+=s[x];
                   x = w[x];
               }

           // cout<<"final: "<<x<<" "<<z<<endl;

    z += sums[x];

    return z;
}

Compilation message (stderr)

dungeons.cpp: In function 'void init(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
dungeons.cpp:29:11: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |  for(i=0;i<_s.size();i++)
      |          ~^~~~~~~~~~
dungeons.cpp:32:11: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  for(i=0;i<_p.size();i++)
      |          ~^~~~~~~~~~
dungeons.cpp:35:11: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |  for(i=0;i<_w.size();i++)
      |          ~^~~~~~~~~~
dungeons.cpp:38:11: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |  for(i=0;i<_l.size();i++)
      |          ~^~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...