이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#pragma region dalykai
using p32 = pair<int, int>;
using p32u = pair<uint32_t, uint32_t>;
using p64 = pair<int64_t, int64_t>;
using p64u = pair<uint64_t, uint64_t>;
using vi16 = vector<int16_t>;
using vi16u = vector<uint16_t>;
using vi32 = vector<int>;
using vi32u = vector<uint32_t>;
using vi64 = vector<int64_t>;
using vi64u = vector<uint64_t>;
using vp32 = vector<p32>;
using vp32u = vector<p32u>;
using vp64 = vector<p64>;
using vp64u = vector<p64u>;
using vvi32 = vector<vi32>;
using vvi32u = vector<vi32u>;
using vvi64 = vector<vi64>;
using vvi64u = vector<vi64u>;
using vvp32 = vector<vp32>;
using vvp32u = vector<vp32u>;
using vvp64 = vector<vp64>;
using vvp64u = vector<vp64u>;
using pf32 = pair<float, float>;
using pf64 = pair<double, double>;
using pf80 = pair<long double, long double>;
using vf32 = vector<float>;
using vf64 = vector<double>;
using vf80 = vector<long double>;
using vpf32 = vector<pf32>;
using vpf64 = vector<pf64>;
using vpf80 = vector<pf80>;
using vvf32 = vector<vf32>;
using vvf64 = vector<vf64>;
using vvf80 = vector<vf80>;
using vvpf32 = vector<vpf32>;
using vvpf64 = vector<vpf64>;
using vvpf80 = vector<vpf80>;
template <typename key, typename val>
using ord_map = tree<key, val, less<key>, rb_tree_tag,
tree_order_statistics_node_update>;
template <typename key>
using ord_set = tree<key, null_type, less<key>, rb_tree_tag,
tree_order_statistics_node_update>;
const int BUF_SZ = 1 << 15;
inline namespace fast_in
{
char buf[BUF_SZ];
int pos;
int len;
char next_char(FILE *f)
{
if (pos == len)
{
pos = 0;
len = (int)fread(buf, 1, BUF_SZ, f);
if (!len)
{
return EOF;
}
}
return buf[pos++];
}
int read_int(FILE *f)
{
int x;
char ch;
int sgn = 1;
while (!isdigit(ch = next_char(f)))
{
if (ch == '-')
{
sgn *= -1;
}
}
x = ch - '0';
while (isdigit(ch = next_char(f)))
{
x = x * 10 + (ch - '0');
}
return x * sgn;
}
}
/**
* @brief gale programos flush_out kviest!!
*/
inline namespace fast_out
{
char buf[BUF_SZ];
int pos;
void flush_out(FILE *f)
{
fwrite(buf, 1, pos, f);
pos = 0;
}
void write_char(char c, FILE *f)
{
if (pos == BUF_SZ)
{
flush_out(f);
}
buf[pos++] = c;
}
void write_int(int x, FILE *f)
{
static char num_buf[100];
if (x < 0)
{
write_char('-', f);
x *= -1;
}
int len = 0;
for (; x >= 10; x /= 10)
{
num_buf[len++] = (char)('0' + (x % 10));
}
write_char((char)('0' + x), f);
while (len)
{
write_char(num_buf[--len], f);
}
write_char('\n', f);
}
}
#pragma endregion
using change_t = vector<vector<pair<int, bool>>>;
void fix_multisets(int i,
change_t &insert, change_t &erase,
multiset<int> &opt, multiset<int> &diff)
{
for (auto &[val, which] : insert[i])
{
if (which)
{
opt.insert(val);
}
else
{
diff.insert(val);
}
}
for (auto &[val, which] : erase[i])
{
if (which)
{
auto it = opt.find(val);
opt.erase(it);
}
else
{
auto it = diff.find(val);
diff.erase(it);
}
}
}
int main()
{
#ifndef _AAAAAAAAA
freopen("lmio_2018_3e2_plaukimo_varzybos_vyr.in", "r", stdin);
freopen("lmio_2018_3e2_plaukimo_varzybos_vyr.out", "w", stdout);
// ios_base::sync_with_stdio(false);
// cin.tie(0);
#else
freopen("swim.in", "r", stdin);
#ifndef __linux__
atexit([]()
{
freopen("con", "r", stdin);
system("pause"); });
#endif
#endif
int n, l, u;
cin >> n >> l >> u;
vi32 nums(n);
for (int i = 0; i < n; i++)
{
cin >> nums[i];
}
sort(nums.begin(), nums.end());
vi32 dp(n, INT_MAX);
vvp32 change(n + 1);
// true jei is opt
vector<vector<pair<int, bool>>> erase(n + 1), insert(n + 1);
multiset<int> opt, diff;
insert[min(n, l - 1)].emplace_back(nums[0], false);
erase[min(n, u)].emplace_back(nums[0], false);
fix_multisets(0, insert, erase, opt, diff);
// kazkaip reikia pradzia (i = 0) sutvarkyt
for (int i = 1; i < n; i++)
{
fix_multisets(i, insert, erase, opt, diff);
if (opt.size())
{
dp[i] = min(dp[i], *opt.begin());
}
if (diff.size())
{
dp[i] = min(dp[i], nums[i] - *diff.rbegin());
}
if (i >= n - 1 || dp[i] == INT_MAX)
{
continue;
}
int bound = dp[i] + nums[i + 1];
int lower = min(n, i + l) - 1;
int upper = min(n, i + u) - 1;
bound = (int)distance(nums.begin(), upper_bound(nums.begin(), nums.end(), bound));
if (bound <= lower)
{
continue;
}
insert[lower + 1].emplace_back(dp[i], true);
if (bound > upper)
{
erase[upper + 1].emplace_back(dp[i], true);
}
else
{
erase[bound].emplace_back(dp[i], true);
insert[bound].emplace_back(nums[i + 1], false);
erase[upper + 1].emplace_back(nums[i + 1], false);
}
/*for (int j = i - u + 1; j <= i - l + 1; j++)
{
if (j < 0)
{
continue;
}
int cur = j ? max(dp[j - 1], nums[i] - nums[j]) : nums[i] - nums[j];
dp[i] = min(dp[i], cur);
}
*/
}
cout << dp.back() << '\n';
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
plaukimo_varzybos.cpp:8: warning: ignoring '#pragma region dalykai' [-Wunknown-pragmas]
8 | #pragma region dalykai
|
plaukimo_varzybos.cpp:151: warning: ignoring '#pragma endregion ' [-Wunknown-pragmas]
151 | #pragma endregion
|
plaukimo_varzybos.cpp: In function 'int main()':
plaukimo_varzybos.cpp:187:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
187 | freopen("lmio_2018_3e2_plaukimo_varzybos_vyr.in", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
plaukimo_varzybos.cpp:188:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
188 | freopen("lmio_2018_3e2_plaukimo_varzybos_vyr.out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |