Submission #163006

#TimeUsernameProblemLanguageResultExecution timeMemory
163006johuthaSalesman (IOI09_salesman)C++14
90 / 100
1085 ms59640 KiB
#include <map>
#include <vector>
#include <iostream>
#include <algorithm>

#define int int64_t

using namespace std;

struct fair
{
	int x, t, p;
};

struct hull
{
	map<int,int> treasuremap;
	int up;
	int down;

	int calcdist(int from, int to)
	{
		int dist = abs(to - from);
		if (from > to) return dist*up;
		return dist*down;
	}

	int query(int pos)
	{
		auto next = treasuremap.upper_bound(pos);
		int res = -1e12;
		if (next != treasuremap.end())
		{
			auto [x, v] = *next;
			res = max(res, v - calcdist(x, pos));
		}
		if (next != treasuremap.begin())
		{
			auto [x, v] = *prev(next);
			res = max(res, v - calcdist(x, pos));
		}
		return res;
	}
	
	void add(int pos, int val)
	{
		if (query(pos) > val) return;
		auto itb = treasuremap.insert({pos, val}).first;
		
		auto itn = next(itb);
		while (itn != treasuremap.end())
		{
			if (val - calcdist(pos, (*itn).first) >= (*itn).second)
			{
				itn = treasuremap.erase(itn);
			}
			else break;
		}

		while (itb != treasuremap.begin())
		{
			auto it = prev(itb);
			if (val - calcdist(pos, (*it).first) >= (*it).second)
			{
				itb = treasuremap.erase(it);
			}
			else break;
		}
	}
};

signed main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n, d, u, s;
	cin >> n >> d >> u >> s;

	map<int, vector<fair>> fairs;

	for (int i = 0; i < n; i++)
	{
		fair nf;
		cin >> nf.t >> nf.x >> nf.p;
		fairs[nf.t].push_back(nf);
	}

	/*
	cout << "\n";
	for (auto fl : fairs)
	{
		for (auto f : fl)
		{
			cout << f.t << " " << f.num << "\n";
		}
		cout << "\n";
	}*/

	hull h;
	h.up = u;
	h.down = d;
	h.add(s, 0);

	for (auto& [_, fl] : fairs)
	{
		sort(fl.begin(), fl.end(), [&](fair const& lhs, fair const& rhs) { return lhs.x < rhs.x; });
		int cn = fl.size();
		vector<int> cstr(cn);
		vector<int> cstrl(cn);
		int q = -1e12;
		int lp = -1e4;
		for (int i = 0; i < cn; i++)
		{
			cstr[i] = max(q - h.calcdist(lp, fl[i].x), h.query(fl[i].x)) + fl[i].p;
			lp = fl[i].x;
			q = cstr[i];
		}
		q = -1e12;
		lp = 1e8;
		for (int i = cn - 1; i >= 0; i--)
		{
			cstrl[i] = max(q - h.calcdist(lp, fl[i].x), h.query(fl[i].x)) + fl[i].p;
			lp = fl[i].x;
			q = cstrl[i];
		}

		for (int i = 0; i < cn; i++)
		{
			h.add(fl[i].x, max(cstr[i], cstrl[i]));
		}
	}

	cout << h.query(s) << "\n";
}

Compilation message (stderr)

salesman.cpp: In member function 'int64_t hull::query(int64_t)':
salesman.cpp:34:9: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
    auto [x, v] = *next;
         ^
salesman.cpp:39:9: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
    auto [x, v] = *prev(next);
         ^
salesman.cpp: In function 'int main()':
salesman.cpp:104:13: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
  for (auto& [_, fl] : fairs)
             ^
salesman.cpp:104:19: warning: unused variable '_' [-Wunused-variable]
  for (auto& [_, fl] : fairs)
                   ^
#Verdict Execution timeMemoryGrader output
Fetching results...