This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <algorithm>
#include <vector>
struct Reindex
{
Reindex(int d, int e, int p) : device(d), elem(e), pos(p) {}
int device, elem, pos;
bool operator <(const Reindex &other) const
{
return (pos < other.pos);
}
};
const int MAXN = 1e5;
const long long INFTY = 1e18;
const int LEAVES = 1 << 19;
const int TSIZE = LEAVES << 1;
int left[MAXN], right[MAXN];
int drop[MAXN];
int cost[MAXN];
std::vector<Reindex> compress;
long long tree[TSIZE];
long long getLeft[MAXN];
long long getRight[MAXN];
void reset()
{
std::fill_n(tree, TSIZE, INFTY);
}
void upd(int node, long long val)
{
tree[node] = std::min(tree[node], val);
if (node > 1)
upd(node / 2, val);
}
long long req(int leftNode, int rightNode)
{
long long ans = INFTY;
if (leftNode % 2 == 1)
ans = std::min(ans, tree[leftNode++]);
if (rightNode % 2 == 1)
ans = std::min(ans, tree[--rightNode]);
if (leftNode < rightNode)
ans = std::min(ans, req(leftNode / 2, rightNode / 2));
return ans;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cout.tie(nullptr);
std::cin.tie(nullptr);
int lines, columns;
std::cin >> lines >> columns;
for (int iDevice = 0; iDevice < lines; iDevice++)
{
std::cin >> left[iDevice] >> right[iDevice] >> drop[iDevice] >> cost[iDevice];
compress.emplace_back(iDevice, 0, left[iDevice] - 1);
compress.emplace_back(iDevice, 1, right[iDevice] - 1);
compress.emplace_back(iDevice, 2, drop[iDevice] - 1);
}
compress.emplace_back(-1, -1, 0);
compress.emplace_back(-1, -1, columns - 1);
std::sort(compress.begin(), compress.end());
int trueCol = 0;
for (int iElem = 0; iElem < (int)compress.size(); trueCol++)
for (int jElem = iElem; iElem < (int)compress.size() && compress[iElem].pos == compress[jElem].pos; iElem++)
{
if (compress[iElem].elem == 0)
left[compress[iElem].device] = trueCol;
else if (compress[iElem].elem == 1)
right[compress[iElem].device] = trueCol + 1;
else if (compress[iElem].elem == 2)
drop[compress[iElem].device] = trueCol;
}
reset();
upd(LEAVES, 0);
for (int iDev = 0; iDev < lines; iDev++)
{
getLeft[iDev] = req(LEAVES + left[iDev], LEAVES + right[iDev]);
upd(LEAVES + drop[iDev], getLeft[iDev] + cost[iDev]);
}
reset();
upd(LEAVES + trueCol - 1, 0);
for (int iDev = 0; iDev < lines; iDev++)
{
getRight[iDev] = req(LEAVES + left[iDev], LEAVES + right[iDev]);
upd(LEAVES + drop[iDev], getRight[iDev] + cost[iDev]);
}
long long minCost = INFTY;
for (int iDev = 0; iDev < lines; iDev++)
minCost = std::min(minCost, getLeft[iDev] + getRight[iDev] + cost[iDev]);
if (minCost == INFTY)
std::cout << "-1\n";
else
std::cout << minCost << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |