QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#19009 | #1877. Matryoshka Dolls | Z_char | RE | 0ms | 0kb | C++20 | 3.7kb | 2022-01-27 18:21:40 | 2022-05-06 03:33:17 |
Judging History
answer
#include <bits/stdc++.h>
template<class T>
inline T read() {
T x = 0; int f = 1; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
return x * f;
}
template<class T> inline void read(T &x) { x = read<T>(); }
template<class T, class... Args> inline void read(T &fir, Args&... args) { read(fir), read(args...); }
template<class T>
inline void write(T x, char ch = '\n') {
static int stk[32];
if (x < 0) putchar('-'), x = -x;
int top = 0;
do stk[++top] = x % 10, x /= 10; while(x);
while (top) putchar(stk[top--] + 48);
putchar(ch);
}
template<class T, class... Args> inline void write(T fir, Args... args) { write(fir, ' '), write(args...); }
using ll = long long;
const int N = 5e5 + 8;
int n, m, a[N], B;
struct Yiw {
Yiw() { l = r = id = 0; }
Yiw(int l, int r, int id) : l(l), r(r), id(id) {}
int l, r, id;
friend bool operator<(const Yiw &a, const Yiw &b) {
if (a.l / B != b.l / B) {
return a.l < b.l;
}
if ((a.l / B) & 1) {
return a.r < b.r;
}
else {
return a.r > b.r;
}
}
};
signed main() {
freopen("rrads.in", "r", stdin), freopen("rrads.out", "w", stdout);
read(n, m);
for (int i = 1; i <= n; ++i) {
a[i] = read<int>();
}
if (n <= 10000) {
std::vector<std::vector<std::pair<int, int>>> ask(n + 1);
std::vector<int> ans(m + 1);
for (int i = 1; i <= m; ++i) {
int l, r;
read(l, r);
ask[r].push_back({l, i});
}
std::set<std::pair<int, int>> set;
for (int _r = 1, ret = 0; _r <= n; ++_r, ret = 0) {
std::sort(ask[_r].begin(), ask[_r].end());
for (int _l = _r; _l >= 1; --_l) {
auto it = set.insert({a[_l], _l}).first;
if (it != set.begin()) {
ret += std::abs(_l - (*std::prev(it)).second);
}
if (std::next(it) != set.end()) {
ret += std::abs(_l - (*std::next(it)).second);
}
if (it != set.begin() && std::next(it) != set.end()) {
ret -= std::abs((*std::prev(it)).second - (*std::next(it)).second);
}
while (ask[_r].size() && ask[_r].back().first == _l) {
ans[ask[_r].back().second] = ret;
ask[_r].pop_back();
}
}
set.clear();
}
for (int i = 1; i <= m; ++i) {
write(ans[i], '\n');
}
}
else {
B = std::sqrt(n);
std::vector<Yiw> yiw(m);
std::vector<ll> ans(m);
for (int i = 0; i < m; ++i) {
int l, r;
read(l, r);
yiw[i] = Yiw(l, r, i);
}
std::sort(yiw.begin(), yiw.end());
std::set<std::pair<int, int>> set; ll ret = 0;
auto add = [&](int x) {
auto it = set.insert({a[x], x}).first;
if (it != set.begin()) {
ret += std::abs(x - (*std::prev(it)).second);
}
if (std::next(it) != set.end()) {
ret += std::abs(x - (*std::next(it)).second);
}
if (it != set.begin() && std::next(it) != set.end()) {
ret -= std::abs((*std::prev(it)).second - (*std::next(it)).second);
}
};
auto del = [&](int x) {
auto it = set.find({a[x], x});
if (it != set.begin()) {
ret -= std::abs(x - (*std::prev(it)).second);
}
if (std::next(it) != set.end()) {
ret -= std::abs(x - (*std::next(it)).second);
}
if (it != set.begin() && std::next(it) != set.end()) {
ret += std::abs((*std::prev(it)).second - (*std::next(it)).second);
}
set.erase(it);
};
for (int L = 1, R = 0, _ = 0; _ < m; ++_) {
int l = yiw[_].l, r = yiw[_].r, id = yiw[_].id;
while (l < L) {
add(--L);
}
while (R < r) {
add(++R);
}
while (L < l) {
del(L++);
}
while (r < R) {
del(R--);
}
ans[id] = ret;
}
for (int i = 0; i < m; ++i) {
write(ans[i], '\n');
}
}
}
/*
5 2
5 4 2 3 1
3 4
2 5
*/
详细
Test #1:
score: 0
Dangerous Syscalls
input:
5 5 1 5 2 4 3 1 5 1 4 1 3 1 2 1 1