Tue, 12 Feb 2019 16:24:17 GMT

master
大蒟蒻 7 years ago
parent bd7469930f
commit b9f0d92e34

@ -97,3 +97,7 @@ multiset加前缀和
可是啊有更多的事情就算愿意付出时间去等待也是没有结果的吧。就算等到了感觉大概也是完全不同的。正如C++20+一定会在某一天变成编译器的默认配置,但是那个时候,我早已退役,默认选项是什么,已经不重要了。
multiset的count好像格外的慢呢。或许是通过`distance(lower_bound,upper_bound)`实现的吧,$log(n)$都变成$nlog(n)$了这种计数还是用map吧。
### U - One-Dimensional Battle Ships
维护一下每一段最多能放下的个数之和。

@ -4,5 +4,20 @@
using namespace std;
int main()
{
int n, k, a, m, ans = -1;
scanf("%d%d%d%d", &n, &k, &a, &m);
auto calc = [&a](auto l, auto r) { return (r - l + 2) / (a + 1); };
set<pair<int, int>> s({{n, 1}});
int ships = calc(1, n);
for (int i = 1, x; i <= m && ans == -1; i++)
{
scanf("%d", &x);
auto [r, l] = *s.lower_bound({x, -1});
s.erase({r, l}), ships -= calc(l, r);
if (l < x) s.insert({x - 1, l}), ships += calc(l, x - 1);
if (x < r) s.insert({r, x + 1}), ships += calc(x + 1, r);
if (ships < k) ans = i;
}
printf("%d", ans);
return 0;
}

@ -0,0 +1,32 @@
#pragma once
#ifndef __TMPL_H_
#define __TMPL_H_
#include <iterator>
template <typename T = int>
class range
{
private:
class range_iterator : std::iterator<std::forward_iterator_tag, T>
{
private:
T val, step;
public:
range_iterator(T x, T sp) : val(x), step(sp) {}
bool operator==(const range_iterator &rhs) const noexcept
{
if (step > 0) return val - step < rhs.val && val >= rhs.val;
if (step < 0) return val - step > rhs.val && val <= rhs.val;
return val == rhs.val;
}
bool operator!=(const range_iterator &rhs) const noexcept { return !(*this == rhs); }
const auto &operator++() { return val += step, *this; }
T &operator*() { return val; }
} st, ed;
public:
range(T ed) : range(0, ed, 1) {}
range(T st, T ed, T sp = 1) : st(st, sp), ed(ed, sp) {}
const range_iterator &begin() { return st; }
const range_iterator &end() { return ed; }
};
#endif
Loading…
Cancel
Save