제출 #846040

#제출 시각아이디문제언어결과실행 시간메모리
846040denniskim추월 (IOI23_overtaking)C++17
0 / 100
7 ms35416 KiB
#include "overtaking.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef __int128 lll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pld;
#define MAX 9223372036854775807LL
#define MIN -9223372036854775807LL
#define INF 0x3f3f3f3f3f3f3f3f
#define fi first
#define se second
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cout << fixed; cout.precision(10);
#define sp << " "
#define en << "\n"
#define compress(v) sort(v.begin(), v.end()), v.erase(unique(v.begin(), v.end()), v.end())

vector<pll> vec[1000010];
pll rng[1000010];
ll cc;
ll n, m, x;
pll a[1010];
vector<ll> in;
ll deg[1000010], dp[1000010];
vector< pair<pll, ll> > ans;
ll stp[1000010];
ll s[1000010];
ll t[1000010];

bool comp(pll X, pll Y)
{
	return X.se < Y.se;
}

void init(int L, int N, vector<ll> T, vector<int> W, int X, int M, vector<int> S)
{
	n = N;
	m = M;
	x = X;
	
	ll ccc = 0;
	
	for(ll i = 0 ; i < n ; i++)
		t[i] = T[i];
	
	for(ll i = 0 ; i < n ; i++)
	{
		if(W[i] <= X)
			continue;
		
		a[ccc] = {W[i], T[i]};
		ccc++;
	}
	
	for(ll i = 0 ; i < m ; i++)
		s[i] = S[i];
	
	n = ccc;
	
	sort(a, a + n, comp);
	
	vector<pll> last;
	
	for(ll i = 1 ; i < m ; i++)
	{
		ll dist = S[i] - S[i - 1];
		stack<pll> stk;
		
		for(ll j = n - 1 ; j >= 0 ; j--)
		{
			while(!stk.empty() && stk.top().fi <= a[j].fi * dist + a[j].se)
				stk.pop();
			
			stk.push({a[j].fi * dist + a[j].se, j});
		}
		
		vector<ll> num;
		
		while(!stk.empty())
		{
			num.push_back(stk.top().se);
			stk.pop();
		}
		
		vector<pll> tmtmp;
		
		if(!last.empty())
		{
			ll p = 0;
			
			for(ll j = 0 ; j < num.size() ; j++)
			{
				while(p < (ll)last.size() && last[p].fi <= num[j])
					p++;
				
				if(p == (ll)last.size())
					break;
				
				cc++;
				deg[last[p].se]++;
				vec[cc].push_back({last[p].se, a[num[j]].fi * dist + a[num[j]].se});
				tmtmp.push_back({num[j], cc});
			}
			
			last = tmtmp;
		}
		
		else
		{
			for(ll j = 0 ; j < (ll)num.size() ; j++)
			{
				cc++;
				last.push_back({num[j], cc});
			}
			
			in = num;
		}
		
		num.push_back(n);
		
		for(ll j = 0 ; j < (ll)num.size() - 1 ; j++)
		{
			ll gap = a[num[j]].fi * dist + a[num[j]].se;
			sort(a + num[j], a + num[j + 1]);
			
			for(ll k = num[j] ; k < num[j + 1] ; k++)
				a[k].se = gap;
		}
	}
	
	queue<ll> q;
	
	for(ll i = 1 ; i <= cc ; i++)
	{
		if(!deg[i])
			q.push(i);
	}
	
	while(!q.empty())
	{
		ll qq = q.front();
		q.pop();
		
		for(auto &i : vec[qq])
		{
			dp[i.fi] = max(dp[i.fi], max(dp[qq], i.se));
			deg[i.fi]--;
			stp[i.fi] = stp[qq] + 1;
			
			if(!deg[i.fi])
				q.push(i.fi);
		}
	}
	
	for(ll i = 0 ; i < (ll)in.size() ; i++)
		ans.push_back({{dp[i + 1], in[i]}, stp[i + 1]});
	
	return;
}

ll arrival_time(ll Y)
{
	ll l = 0, r = (ll)ans.size() - 1;
	
	while(l <= r)
	{
		ll mid = (l + r) >> 1;
		
		if(t[ans[mid].fi.se] <= Y)
			l = mid + 1;
		else
			r = mid - 1;
	}
	
	if(r == -1)
		return s[m - 1] * x;
	
	ll ret = ans[r].fi.fi;
	ret += (s[m - 1] - s[ans[r].se + 1]) * x;
	
    return ret;
}

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

overtaking.cpp: In function 'void init(int, int, std::vector<long long int>, std::vector<int>, int, int, std::vector<int>)':
overtaking.cpp:93:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |    for(ll j = 0 ; j < num.size() ; j++)
      |                   ~~^~~~~~~~~~~~
#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...