You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.8 KiB
C++
83 lines
2.8 KiB
C++
#include <cstdio>
|
|
#include <set>
|
|
#include <utility>
|
|
#include <algorithm>
|
|
using namespace std;
|
|
int n, m, a[100001], nxt[100001][2], s, x, len[100001][2];
|
|
int main()
|
|
{
|
|
scanf("%d", &n);
|
|
for (int i = 1; i <= n; i++)
|
|
scanf("%d", a + i);
|
|
set<pair<int, int>> S;
|
|
for (int i = 1; i <= n; i++) S.insert(make_pair(a[i], i));
|
|
pair<int, int> tmp[4];
|
|
for (int i = 1; i <= n; i++)
|
|
{
|
|
auto ite = S.find(make_pair(a[i], i));
|
|
_ASSERT(ite != S.end());
|
|
for (int j = 0; j < 4; j++)
|
|
tmp[j].first = 0x3f3f3f3f, tmp[j].second = 0;
|
|
int k = 0;
|
|
auto _ite = ite;
|
|
advance(_ite, -1);
|
|
if (_ite != S.end())
|
|
{
|
|
tmp[k].first = abs(_ite->first - ite->first);
|
|
tmp[k].second = _ite->second;
|
|
k++;
|
|
advance(_ite, -1);
|
|
if (_ite != S.end())
|
|
tmp[k].first = abs(_ite->first - ite->first),
|
|
tmp[k].second = _ite->second, k++;
|
|
}
|
|
_ite = ite;
|
|
advance(_ite, 1);
|
|
if (_ite != S.end())
|
|
{
|
|
tmp[k].first = abs(_ite->first - ite->first);
|
|
tmp[k].second = _ite->second;
|
|
k++;
|
|
advance(_ite, 1);
|
|
if (_ite != S.end())
|
|
tmp[k].first = abs(_ite->first - ite->first),
|
|
tmp[k].second = _ite->second, k++;
|
|
}
|
|
S.erase(ite);
|
|
sort(tmp, tmp + k, [&](const pair<int, int>& l, const pair<int, int>& r) {
|
|
if (l.first < r.first) return true;
|
|
if (l.first > r.first) return false;
|
|
return a[l.second] < a[r.second];
|
|
});
|
|
nxt[i][1] = tmp[0].second;
|
|
nxt[i][0] = tmp[1].second;
|
|
}
|
|
scanf("%d", &x);
|
|
for (int i = 1; i <= n; i++)
|
|
for (int p = 0, j = i;; j = nxt[j][p], p ^= 1)
|
|
{
|
|
if (nxt[j][0] == 0 || nxt[j][1] == 0) break;
|
|
len[i][p] += abs(a[j] - a[nxt[j][p]]);
|
|
if (len[i][0] + len[i][1] > x) { len[i][p] -= abs(a[j] - a[nxt[j][p]]); break; }
|
|
}
|
|
struct { int id; double val; } ans;
|
|
ans.id = -1, ans.val = 1e20;
|
|
for (int i = 1; i <= n; i++)
|
|
if (len[i][1] != 0 && ans.val > 1.0*len[i][0] / len[i][1])
|
|
ans.val = 1.0*len[i][0] / len[i][1], ans.id = i;
|
|
printf("%d\n", ans.id);
|
|
memset(len, 0, sizeof(len));
|
|
scanf("%d", &m);
|
|
for (int i = 1; i <= m; i++)
|
|
{
|
|
scanf("%d%d", &s, &x);
|
|
for (int p = 0, j = s;; j = nxt[j][p], p ^= 1)
|
|
{
|
|
if (nxt[j][p] == 0) break;
|
|
len[s][p] += abs(a[j] - a[nxt[j][p]]);
|
|
if (len[s][0] + len[s][1] > x) { len[s][p] -= abs(a[j] - a[nxt[j][p]]); break; }
|
|
}
|
|
printf("%d %d\n", len[s][0], len[s][1]);
|
|
}
|
|
return 0;
|
|
} |