QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#378838 | #8574. Swirly Sort | ucup-team180# | AC ✓ | 51ms | 11960kb | C++17 | 36.2kb | 2024-04-06 14:55:12 | 2024-04-06 14:55:13 |
Judging History
answer
#pragma region Macros
#ifdef noimi
#pragma comment(linker, "/stack:256000000")
#include "my_template.hpp"
#else
// #pragma GCC target("avx2")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <immintrin.h>
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cfenv>
#include <cfloat>
#include <chrono>
#include <cinttypes>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdarg>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <functional>
#include <immintrin.h>
#include <initializer_list>
#include <iomanip>
#include <ios>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <streambuf>
#include <string>
#include <tuple>
#include <type_traits>
#include <utility>
#include <variant>
#ifdef noimi
#define oj_local(a, b) b
#else
#define oj_local(a, b) a
#endif
#define LOCAL if(oj_local(0, 1))
#define OJ if(oj_local(1, 0))
using namespace std;
using ll = long long;
using ull = unsigned long long int;
using i128 = __int128_t;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using ld = long double;
template <typename T> using vc = vector<T>;
template <typename T> using vvc = vector<vc<T>>;
template <typename T> using vvvc = vector<vvc<T>>;
using vi = vc<int>;
using vl = vc<ll>;
using vpi = vc<pii>;
using vpl = vc<pll>;
template <class T> using pq = priority_queue<T>;
template <class T> using pqg = priority_queue<T, vector<T>, greater<T>>;
template <typename T> int si(const T &x) { return x.size(); }
template <class T, class S> inline bool chmax(T &a, const S &b) { return (a < b ? a = b, 1 : 0); }
template <class T, class S> inline bool chmin(T &a, const S &b) { return (a > b ? a = b, 1 : 0); }
vi iota(int n) {
vi a(n);
return iota(a.begin(), a.end(), 0), a;
}
template <typename T> vi iota(const vector<T> &a, bool greater = false) {
vi res(a.size());
iota(res.begin(), res.end(), 0);
sort(res.begin(), res.end(), [&](int i, int j) {
if(greater) return a[i] > a[j];
return a[i] < a[j];
});
return res;
}
// macros
#define overload5(a, b, c, d, e, name, ...) name
#define overload4(a, b, c, d, name, ...) name
#define endl '\n'
#define REP0(n) for(ll jidlsjf = 0; jidlsjf < n; ++jidlsjf)
#define REP1(i, n) for(ll i = 0; i < (n); ++i)
#define REP2(i, a, b) for(ll i = (a); i < (b); ++i)
#define REP3(i, a, b, c) for(ll i = (a); i < (b); i += (c))
#define rep(...) overload4(__VA_ARGS__, REP3, REP2, REP1, REP0)(__VA_ARGS__)
#define per0(n) for(int jidlsjf = 0; jidlsjf < (n); ++jidlsjf)
#define per1(i, n) for(ll i = (n)-1; i >= 0; --i)
#define per2(i, a, b) for(ll i = (a)-1; i >= b; --i)
#define per3(i, a, b, c) for(ll i = (a)-1; i >= (b); i -= (c))
#define per(...) overload4(__VA_ARGS__, per3, per2, per1, per0)(__VA_ARGS__)
#define fore0(a) rep(a.size())
#define fore1(i, a) for(auto &&i : a)
#define fore2(a, b, v) for(auto &&[a, b] : v)
#define fore3(a, b, c, v) for(auto &&[a, b, c] : v)
#define fore4(a, b, c, d, v) for(auto &&[a, b, c, d] : v)
#define fore(...) overload5(__VA_ARGS__, fore4, fore3, fore2, fore1, fore0)(__VA_ARGS__)
#define setbits(j, n) for(ll iiiii = (n), j = lowbit(iiiii); iiiii; iiiii ^= 1 << j, j = lowbit(iiiii))
#define perm(v) for(bool permrepflag = true; (permrepflag ? exchange(permrepflag, false) : next_permutation(all(v)));)
#define fi first
#define se second
#define pb push_back
#define ppb pop_back
#define ppf pop_front
#define eb emplace_back
#define drop(s) cout << #s << endl, exit(0)
#define si(c) (int)(c).size()
#define lb(c, x) distance((c).begin(), lower_bound(all(c), (x)))
#define lbg(c, x) distance((c).begin(), lower_bound(all(c), (x), greater{}))
#define ub(c, x) distance((c).begin(), upper_bound(all(c), (x)))
#define ubg(c, x) distance((c).begin(), upper_bound(all(c), (x), greater{}))
#define rng(v, l, r) v.begin() + (l), v.begin() + (r)
#define all(c) begin(c), end(c)
#define rall(c) rbegin(c), rend(c)
#define SORT(v) sort(all(v))
#define REV(v) reverse(all(v))
#define UNIQUE(x) SORT(x), x.erase(unique(all(x)), x.end())
template <typename T = ll, typename S> T SUM(const S &v) { return accumulate(all(v), T(0)); }
#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))
#define overload2(_1, _2, name, ...) name
#define vec(type, name, ...) vector<type> name(__VA_ARGS__)
#define vv(type, name, h, ...) vector<vector<type>> name(h, vector<type>(__VA_ARGS__))
#define vvv(type, name, h, w, ...) vector<vector<vector<type>>> name(h, vector<vector<type>>(w, vector<type>(__VA_ARGS__)))
#define vvvv(type, name, a, b, c, ...) \
vector<vector<vector<vector<type>>>> name(a, vector<vector<vector<type>>>(b, vector<vector<type>>(c, vector<type>(__VA_ARGS__))))
constexpr pii dx4[4] = {pii{1, 0}, pii{0, 1}, pii{-1, 0}, pii{0, -1}};
constexpr pii dx8[8] = {{1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}};
namespace yesno_impl {
const string YESNO[2] = {"NO", "YES"};
const string YesNo[2] = {"No", "Yes"};
const string yesno[2] = {"no", "yes"};
const string firstsecond[2] = {"second", "first"};
const string FirstSecond[2] = {"Second", "First"};
const string possiblestr[2] = {"impossible", "possible"};
const string Possiblestr[2] = {"Impossible", "Possible"};
void YES(bool t = 1) { cout << YESNO[t] << endl; }
void NO(bool t = 1) { YES(!t); }
void Yes(bool t = 1) { cout << YesNo[t] << endl; }
void No(bool t = 1) { Yes(!t); }
void yes(bool t = 1) { cout << yesno[t] << endl; }
void no(bool t = 1) { yes(!t); }
void first(bool t = 1) { cout << firstsecond[t] << endl; }
void First(bool t = 1) { cout << FirstSecond[t] << endl; }
void possible(bool t = 1) { cout << possiblestr[t] << endl; }
void Possible(bool t = 1) { cout << Possiblestr[t] << endl; }
}; // namespace yesno_impl
using namespace yesno_impl;
#define INT(...) \
int __VA_ARGS__; \
IN(__VA_ARGS__)
#define INTd(...) \
int __VA_ARGS__; \
IN2(__VA_ARGS__)
#define LL(...) \
ll __VA_ARGS__; \
IN(__VA_ARGS__)
#define LLd(...) \
ll __VA_ARGS__; \
IN2(__VA_ARGS__)
#define STR(...) \
string __VA_ARGS__; \
IN(__VA_ARGS__)
#define CHR(...) \
char __VA_ARGS__; \
IN(__VA_ARGS__)
#define DBL(...) \
double __VA_ARGS__; \
IN(__VA_ARGS__)
#define VEC(type, name, size) \
vector<type> name(size); \
IN(name)
#define VECd(type, name, size) \
vector<type> name(size); \
IN2(name)
#define VEC2(type, name1, name2, size) \
vector<type> name1(size), name2(size); \
for(int i = 0; i < size; i++) IN(name1[i], name2[i])
#define VEC2d(type, name1, name2, size) \
vector<type> name1(size), name2(size); \
for(int i = 0; i < size; i++) IN2(name1[i], name2[i])
#define VEC3(type, name1, name2, name3, size) \
vector<type> name1(size), name2(size), name3(size); \
for(int i = 0; i < size; i++) IN(name1[i], name2[i], name3[i])
#define VEC3d(type, name1, name2, name3, size) \
vector<type> name1(size), name2(size), name3(size); \
for(int i = 0; i < size; i++) IN2(name1[i], name2[i], name3[i])
#define VEC4(type, name1, name2, name3, name4, size) \
vector<type> name1(size), name2(size), name3(size), name4(size); \
for(int i = 0; i < size; i++) IN(name1[i], name2[i], name3[i], name4[i]);
#define VEC4d(type, name1, name2, name3, name4, size) \
vector<type> name1(size), name2(size), name3(size), name4(size); \
for(int i = 0; i < size; i++) IN2(name1[i], name2[i], name3[i], name4[i]);
#define VV(type, name, h, w) \
vector<vector<type>> name(h, vector<type>(w)); \
IN(name)
#define VVd(type, name, h, w) \
vector<vector<type>> name(h, vector<type>(w)); \
IN2(name)
int scan() { return getchar(); }
void scan(int &a) { cin >> a; }
void scan(long long &a) { cin >> a; }
void scan(char &a) { cin >> a; }
void scan(double &a) { cin >> a; }
void scan(string &a) { cin >> a; }
template <class T, class S> void scan(pair<T, S> &p) { scan(p.first), scan(p.second); }
template <class T> void scan(vector<T> &);
template <class T> void scan(vector<T> &a) {
for(auto &i : a) scan(i);
}
template <class T> void scan(T &a) { cin >> a; }
void IN() {}
void IN2() {}
template <class Head, class... Tail> void IN(Head &head, Tail &...tail) {
scan(head);
IN(tail...);
}
template <class Head, class... Tail> void IN2(Head &head, Tail &...tail) {
scan(head);
--head;
IN2(tail...);
}
template <int p = -1> void pat() {}
template <int p = -1, class Head, class... Tail> void pat(Head &h, Tail &...tail) {
h += p;
pat<p>(tail...);
}
template <typename T, typename S> T ceil(T x, S y) {
assert(y);
return (y < 0 ? ceil(-x, -y) : (x > 0 ? (x + y - 1) / y : x / y));
}
template <typename T, typename S> T floor(T x, S y) {
assert(y);
return (y < 0 ? floor(-x, -y) : (x > 0 ? x / y : x / y - (x % y == 0 ? 0 : 1)));
}
template <typename T, typename S, typename U> U bigmul(const T &x, const S &y, const U &lim) { // clamp(x * y, -lim, lim)
if(x < 0 and y < 0) return bigmul(-x, -y, lim);
if(x < 0) return -bigmul(-x, y, lim);
if(y < 0) return -bigmul(x, -y, lim);
return y == 0 or x <= lim / y ? x * y : lim;
}
template <class T> T POW(T x, int n) {
T res = 1;
for(; n; n >>= 1, x *= x)
if(n & 1) res *= x;
return res;
}
template <class T, class S> T POW(T x, S n, const ll &mod) {
T res = 1;
x %= mod;
for(; n; n >>= 1, x = x * x % mod)
if(n & 1) res = res * x % mod;
return res;
}
vector<pll> factor(ll x) {
vector<pll> ans;
for(ll i = 2; i * i <= x; i++)
if(x % i == 0) {
ans.push_back({i, 1});
while((x /= i) % i == 0) ans.back().second++;
}
if(x != 1) ans.push_back({x, 1});
return ans;
}
template <class T> vector<T> divisor(T x) {
vector<T> ans;
for(T i = 1; i * i <= x; i++)
if(x % i == 0) {
ans.pb(i);
if(i * i != x) ans.pb(x / i);
}
return ans;
}
template <typename T> void zip(vector<T> &x) {
vector<T> y = x;
UNIQUE(y);
for(int i = 0; i < x.size(); ++i) { x[i] = lb(y, x[i]); }
}
template <class S> void fold_in(vector<S> &v) {}
template <typename Head, typename... Tail, class S> void fold_in(vector<S> &v, Head &&a, Tail &&...tail) {
for(auto e : a) v.emplace_back(e);
fold_in(v, tail...);
}
template <class S> void renumber(vector<S> &v) {}
template <typename Head, typename... Tail, class S> void renumber(vector<S> &v, Head &&a, Tail &&...tail) {
for(auto &&e : a) e = lb(v, e);
renumber(v, tail...);
}
template <class S, class... Args> vector<S> zip(vector<S> &head, Args &&...args) {
vector<S> v;
fold_in(v, head, args...);
sort(all(v)), v.erase(unique(all(v)), v.end());
renumber(v, head, args...);
return v;
}
template <typename S> void rearrange(const vector<S> &id) {}
template <typename S, typename T> void rearrange_exec(const vector<S> &id, vector<T> &v) {
vector<T> w(v.size());
rep(i, si(id)) w[i] = v[id[i]];
v.swap(w);
}
// 並び替える順番, 並び替える vector 達
template <typename S, typename Head, typename... Tail> void rearrange(const vector<S> &id, Head &a, Tail &...tail) {
rearrange_exec(id, a);
rearrange(id, tail...);
}
template <typename T> vector<T> RUI(const vector<T> &v) {
vector<T> res(v.size() + 1);
for(int i = 0; i < v.size(); i++) res[i + 1] = res[i] + v[i];
return res;
}
template <typename T> void zeta_supersetsum(vector<T> &f) {
int n = f.size();
for(int i = 1; i < n; i <<= 1) rep(b, n) if(!(i & b)) f[b] += f[b | i];
}
template <typename T> void zeta_subsetsum(vector<T> &f) {
int n = f.size();
for(int i = 1; i < n; i <<= 1) rep(b, n) if(!(i & b)) f[b | i] += f[b];
}
template <typename T> void mobius_subset(vector<T> &f) {
int n = f.size();
for(int i = 1; i < n; i <<= 1) rep(b, n) if(!(i & b)) f[b] -= f[b | i];
}
template <typename T> void mobius_superset(vector<T> &f) {
int n = f.size();
for(int i = 1; i < n; i <<= 1) rep(b, n) if(!(i & b)) f[b | i] -= f[b];
}
// 反時計周りに 90 度回転
template <typename T> void rot(vector<vector<T>> &v) {
if(empty(v)) return;
int n = v.size(), m = v[0].size();
vector<vector<T>> res(m, vector<T>(n));
rep(i, n) rep(j, m) res[m - 1 - j][i] = v[i][j];
v.swap(res);
}
vector<int> counter(const vector<int> &v, int max_num = -1) {
if(max_num == -1) max_num = MAX(v);
vector<int> res(max_num + 1);
fore(e, v) res[e]++;
return res;
}
// x in [l, r)
template <class T, class S> bool inc(const T &x, const S &l, const S &r) { return l <= x and x < r; }
template <class T, class S> bool inc(const T &x, const pair<S, S> &p) { return p.first <= x and x < p.second; }
// 便利関数
constexpr ll ten(int n) { return n == 0 ? 1 : ten(n - 1) * 10; }
constexpr ll tri(ll n) { return n * (n + 1) / 2; }
// l + ... + r
constexpr ll tri(ll l, ll r) { return (l + r) * (r - l + 1) / 2; }
ll max(int x, ll y) { return max((ll)x, y); }
ll max(ll x, int y) { return max(x, (ll)y); }
int min(int x, ll y) { return min((ll)x, y); }
int min(ll x, int y) { return min(x, (ll)y); }
// bit 演算系
#define bit(i) (1LL << i) // (1 << i)
#define test(b, i) (b >> i & 1) // b の i bit 目が立っているか
ll pow2(int i) { return 1LL << i; }
int topbit(signed t) { return t == 0 ? -1 : 31 - __builtin_clz(t); }
int topbit(ll t) { return t == 0 ? -1 : 63 - __builtin_clzll(t); }
// int lowbit(signed a) { return a == 0 ? 32 : __builtin_ctz(a); }
int lowbit(ull a) { return a == 0 ? 64 : __builtin_ctzll(a); }
// int allbit(int n) { return (1 << n) - 1; }
constexpr ll mask(int n) { return (1LL << n) - 1; }
// int popcount(signed t) { return __builtin_popcount(t); }
// int popcount(ll t) { return __builtin_popcountll(t); }
int popcount(uint64_t t) { return __builtin_popcountll(t); }
static inline uint64_t popcount64(uint64_t x) {
uint64_t m1 = 0x5555555555555555ll;
uint64_t m2 = 0x3333333333333333ll;
uint64_t m4 = 0x0F0F0F0F0F0F0F0Fll;
uint64_t h01 = 0x0101010101010101ll;
x -= (x >> 1) & m1;
x = (x & m2) + ((x >> 2) & m2);
x = (x + (x >> 4)) & m4;
return (x * h01) >> 56;
}
bool ispow2(int i) { return i && (i & -i) == i; }
ll rnd(ll l, ll r) { //[l, r)
#ifdef noimi
static mt19937_64 gen;
#else
static mt19937_64 gen(chrono::steady_clock::now().time_since_epoch().count());
#endif
return uniform_int_distribution<ll>(l, r - 1)(gen);
}
ll rnd(ll n) { return rnd(0, n); }
template <class t> void random_shuffle(vc<t> &a) { rep(i, si(a)) swap(a[i], a[rnd(0, i + 1)]); }
int in() {
int x;
cin >> x;
return x;
}
ll lin() {
unsigned long long x;
cin >> x;
return x;
}
template <class T, class S> pair<T, S> operator-(const pair<T, S> &x) { return pair<T, S>(-x.first, -x.second); }
template <class T, class S> pair<T, S> operator-(const pair<T, S> &x, const pair<T, S> &y) { return pair<T, S>(x.fi - y.fi, x.se - y.se); }
template <class T, class S> pair<T, S> operator+(const pair<T, S> &x, const pair<T, S> &y) { return pair<T, S>(x.fi + y.fi, x.se + y.se); }
template <class T> pair<T, T> operator&(const pair<T, T> &l, const pair<T, T> &r) { return pair<T, T>(max(l.fi, r.fi), min(l.se, r.se)); }
template <class T, class S> pair<T, S> operator+=(pair<T, S> &l, const pair<T, S> &r) { return l = l + r; }
template <class T, class S> pair<T, S> operator-=(pair<T, S> &l, const pair<T, S> &r) { return l = l - r; }
template <class T> bool intersect(const pair<T, T> &l, const pair<T, T> &r) { return (l.se < r.se ? r.fi < l.se : l.fi < r.se); }
template <class T> vector<T> &operator++(vector<T> &v) {
fore(e, v) e++;
return v;
}
template <class T> vector<T> operator++(vector<T> &v, int) {
auto res = v;
fore(e, v) e++;
return res;
}
template <class T> vector<T> &operator--(vector<T> &v) {
fore(e, v) e--;
return v;
}
template <class T> vector<T> operator--(vector<T> &v, int) {
auto res = v;
fore(e, v) e--;
return res;
}
template <class T> void connect(vector<T> &l, const vector<T> &r) { fore(e, r) l.eb(e); }
template <class T> vector<T> operator+(const vector<T> &l, const vector<T> &r) {
vector<T> res(max(si(l), si(r)));
rep(i, si(l)) res[i] += l[i];
rep(i, si(r)) res[i] += r[i];
return res;
}
template <class T> vector<T> operator-(const vector<T> &l, const vector<T> &r) {
vector<T> res(max(si(l), si(r)));
rep(i, si(l)) res[i] += l[i];
rep(i, si(r)) res[i] -= r[i];
return res;
}
template <class T> vector<T> &operator+=(const vector<T> &l, const vector<T> &r) {
if(si(l) < si(r)) l.resize(si(r));
rep(i, si(r)) l[i] += r[i];
return l;
}
template <class T> vector<T> &operator-=(const vector<T> &l, const vector<T> &r) {
if(si(l) < si(r)) l.resize(si(r));
rep(i, si(r)) l[i] -= r[i];
return l;
}
template <class T> vector<T> &operator+=(vector<T> &v, const T &x) {
fore(e, v) e += x;
return v;
}
template <class T> vector<T> &operator-=(vector<T> &v, const T &x) {
fore(e, v) e -= x;
return v;
}
template <typename T> struct edge {
int from, to;
T cost;
int id;
edge(int to, T cost) : from(-1), to(to), cost(cost) {}
edge(int from, int to, T cost) : from(from), to(to), cost(cost) {}
edge(int from, int to, T cost, int id) : from(from), to(to), cost(cost), id(id) {}
constexpr bool operator<(const edge<T> &rhs) const noexcept { return cost < rhs.cost; }
edge &operator=(const int &x) {
to = x;
return *this;
}
operator int() const { return to; }
friend ostream operator<<(ostream &os, const edge &e) { return os << e.to; }
};
template <typename T> using Edges = vector<edge<T>>;
template <typename T = int> Edges<T> read_edges(int m, bool weighted = false) {
Edges<T> res;
res.reserve(m);
for(int i = 0; i < m; i++) {
int u, v, c = 0;
scan(u), scan(v), u--, v--;
if(weighted) scan(c);
res.eb(u, v, c, i);
}
return res;
}
using Tree = vector<vector<int>>;
using Graph = vector<vector<int>>;
template <class T> using Wgraph = vector<vector<edge<T>>>;
Graph getG(int n, int m = -1, bool directed = false, int margin = 1) {
Tree res(n);
if(m == -1) m = n - 1;
while(m--) {
int a, b;
cin >> a >> b;
a -= margin, b -= margin;
res[a].emplace_back(b);
if(!directed) res[b].emplace_back(a);
}
return res;
}
Graph getTreeFromPar(int n, int margin = 1) {
Graph res(n);
for(int i = 1; i < n; i++) {
int a;
cin >> a;
res[a - margin].emplace_back(i);
}
return res;
}
template <class T> Wgraph<T> getWg(int n, int m = -1, bool directed = false, int margin = 1) {
Wgraph<T> res(n);
if(m == -1) m = n - 1;
while(m--) {
int a, b;
T c;
scan(a), scan(b), scan(c);
a -= margin, b -= margin;
res[a].emplace_back(b, c);
if(!directed) res[b].emplace_back(a, c);
}
return res;
}
void add(Graph &G, int x, int y) { G[x].eb(y), G[y].eb(x); }
template <class S, class T> void add(Wgraph<S> &G, int x, int y, T c) { G[x].eb(y, c), G[y].eb(x, c); }
#define TEST \
INT(testcases); \
while(testcases--)
i128 abs(const i128 &x) { return x > 0 ? x : -x; }
istream &operator>>(istream &is, i128 &v) {
string s;
is >> s;
v = 0;
for(int i = 0; i < (int)s.size(); i++) {
if(isdigit(s[i])) { v = v * 10 + s[i] - '0'; }
}
if(s[0] == '-') { v *= -1; }
return is;
}
ostream &operator<<(ostream &os, const i128 &v) {
if(v == 0) { return (os << "0"); }
i128 num = v;
if(v < 0) {
os << '-';
num = -num;
}
string s;
for(; num > 0; num /= 10) { s.push_back((char)(num % 10) + '0'); }
reverse(s.begin(), s.end());
return (os << s);
}
namespace aux {
template <typename T, unsigned N, unsigned L> struct tp {
static void output(std::ostream &os, const T &v) {
os << std::get<N>(v) << (&os == &cerr ? ", " : " ");
tp<T, N + 1, L>::output(os, v);
}
};
template <typename T, unsigned N> struct tp<T, N, N> {
static void output(std::ostream &os, const T &v) { os << std::get<N>(v); }
};
} // namespace aux
template <typename... Ts> std::ostream &operator<<(std::ostream &os, const std::tuple<Ts...> &t) {
if(&os == &cerr) { os << '('; }
aux::tp<std::tuple<Ts...>, 0, sizeof...(Ts) - 1>::output(os, t);
if(&os == &cerr) { os << ')'; }
return os;
}
template <typename T, typename S, typename U> std::ostream &operator<<(std::ostream &os, const priority_queue<T, S, U> &_pq) {
auto pq = _pq;
vector<T> res;
while(!empty(pq)) res.emplace_back(pq.top()), pq.pop();
return os << res;
}
template <class T, class S> ostream &operator<<(ostream &os, const pair<T, S> &p) {
if(&os == &cerr) { return os << "(" << p.first << ", " << p.second << ")"; }
return os << p.first << " " << p.second;
}
template <class Ch, class Tr, class Container> std::basic_ostream<Ch, Tr> &operator<<(std::basic_ostream<Ch, Tr> &os, const Container &x) {
bool f = true;
if(&os == &cerr) os << "[";
for(auto &y : x) {
if(&os == &cerr)
os << (f ? "" : ", ") << y;
else
os << (f ? "" : " ") << y;
f = false;
}
if(&os == &cerr) os << "]";
return os;
}
#define dump(...) static_cast<void>(0)
#define dbg(...) static_cast<void>(0)
void OUT() { cout << endl; }
template <class Head, class... Tail> void OUT(const Head &head, const Tail &...tail) {
cout << head;
if(sizeof...(tail)) cout << ' ';
OUT(tail...);
}
template <typename T> static constexpr T inf = numeric_limits<T>::max() / 2;
template <class T, class S> constexpr pair<T, S> inf<pair<T, S>> = {inf<T>, inf<S>};
template <class T> void OUT2(const T &t, T INF = inf<T>, T res = -1) { OUT(t != INF ? t : res); }
template <class T> void OUT2(vector<T> &v, T INF = inf<T>, T res = -1) {
fore(e, v) if(e == INF) e = res;
OUT(v);
fore(e, v) if(e == res) e = INF;
}
template <class F> struct REC {
F f;
REC(F &&f_) : f(forward<F>(f_)) {}
template <class... Args> auto operator()(Args &&...args) const { return f(*this, forward<Args>(args)...); }
};
template <class S> vector<pair<S, int>> runLength(const vector<S> &v) {
vector<pair<S, int>> res;
for(auto &e : v) {
if(res.empty() or res.back().fi != e)
res.eb(e, 1);
else
res.back().se++;
}
return res;
}
vector<pair<char, int>> runLength(const string &v) {
vector<pair<char, int>> res;
for(auto &e : v) {
if(res.empty() or res.back().fi != e)
res.eb(e, 1);
else
res.back().se++;
}
return res;
}
struct string_converter {
char start = 0;
char type(const char &c) const { return (islower(c) ? 'a' : isupper(c) ? 'A' : isdigit(c) ? '0' : 0); }
int convert(const char &c) {
if(!start) start = type(c);
return c - start;
}
int convert(const char &c, const string &chars) { return chars.find(c); }
template <typename T> auto convert(const T &v) {
vector<decltype(convert(v[0]))> ret;
ret.reserve(size(v));
for(auto &&e : v) ret.emplace_back(convert(e));
return ret;
}
template <typename T> auto convert(const T &v, const string &chars) {
vector<decltype(convert(v[0], chars))> ret;
ret.reserve(size(v));
for(auto &&e : v) ret.emplace_back(convert(e, chars));
return ret;
}
int operator()(const char &v, char s = 0) {
start = s;
return convert(v);
}
int operator()(const char &v, const string &chars) { return convert(v, chars); }
template <typename T> auto operator()(const T &v, char s = 0) {
start = s;
return convert(v);
}
template <typename T> auto operator()(const T &v, const string &chars) { return convert(v, chars); }
} toint;
template <class T, class F> T bin_search(T ok, T ng, const F &f) {
while(abs(ok - ng) > 1) {
T mid = ok + ng >> 1;
(f(mid) ? ok : ng) = mid;
}
return ok;
}
template <class T, class F> T bin_search_double(T ok, T ng, const F &f, int iter = 80) {
while(iter--) {
T mid = (ok + ng) / 2;
(f(mid) ? ok : ng) = mid;
}
return ok;
}
struct Setup_io {
Setup_io() {
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(11);
}
} setup_io;
#endif
#pragma endregion
template <int N> struct ndFORarray {
std::array<int, N> v;
ndFORarray(std::array<int, N> v_) : v(v_) {}
struct ndFORitr {
const std::array<int, N> &v;
std::array<int, N> tmp;
bool is_end;
ndFORitr(const std::array<int, N> &v_) : v(v_), tmp(), is_end(false) {}
bool operator!=(const ndFORitr &) const { return !is_end; }
void operator++() {
int pos = N - 1;
while(pos != -1) {
tmp[pos] += 1;
if(tmp[pos] == v[pos]) {
tmp[pos] = 0;
pos -= 1;
} else {
break;
}
}
if(pos == -1) { is_end = true; }
}
const std::array<int, N> &operator*() const { return tmp; }
};
ndFORitr begin() const { return ndFORitr(v); }
ndFORitr end() const { return ndFORitr(v); }
};
struct ndFORvector {
std::vector<int> v;
ndFORvector(std::vector<int> v_) : v(v_) {}
struct ndFORitr {
const std::vector<int> &v;
std::vector<int> tmp;
bool is_end;
ndFORitr(const std::vector<int> &v_) : v(v_), tmp(v.size(), 0), is_end(false) {}
bool operator!=(const ndFORitr &) const { return !is_end; }
void operator++() {
int pos = v.size() - 1;
while(pos != -1) {
tmp[pos] += 1;
if(tmp[pos] == v[pos]) {
tmp[pos] = 0;
pos -= 1;
} else {
break;
}
}
if(pos == -1) { is_end = true; }
}
const std::vector<int> &operator*() const { return tmp; }
};
ndFORitr begin() const { return ndFORitr(v); }
ndFORitr end() const { return ndFORitr(v); }
};
auto ndFOR(std::vector<int> v) { return ndFORvector(v); }
template <class... Ts> auto ndFOR(Ts... v) { return ndFORarray<std::tuple_size<std::tuple<Ts...>>::value>({v...}); }
/**
* @brief Slope-Trick
* @docs docs/slope-trick.md
* @see https://maspypy.com/slope-trick-1-%E8%A7%A3%E8%AA%AC%E7%B7%A8
*/
template <typename T> struct SlopeTrick {
const T INF = numeric_limits<T>::max() / 3;
T min_f;
priority_queue<T, vector<T>, less<>> L;
priority_queue<T, vector<T>, greater<>> R;
T add_l, add_r;
private:
void push_R(const T &a) { R.push(a - add_r); }
T top_R() const {
if(R.empty())
return INF;
else
return R.top() + add_r;
}
T pop_R() {
T val = top_R();
if(not R.empty()) R.pop();
return val;
}
void push_L(const T &a) { L.push(a - add_l); }
T top_L() const {
if(L.empty())
return -INF;
else
return L.top() + add_l;
}
T pop_L() {
T val = top_L();
if(not L.empty()) L.pop();
return val;
}
size_t size() { return L.size() + R.size(); }
public:
SlopeTrick() : min_f(0), add_l(0), add_r(0) {}
struct Query {
T lx, rx, min_f;
};
// return min f(x)
Query query() const { return (Query){top_L(), top_R(), min_f}; }
// f(x) += a
void add_all(const T &a) { min_f += a; }
// add \_
// f(x) += max(a - x, 0)
void add_a_minus_x(const T &a) {
min_f += max(T(0), a - top_R());
push_R(a);
push_L(pop_R());
}
// add _/
// f(x) += max(x - a, 0)
void add_x_minus_a(const T &a) {
min_f += max(T(0), top_L() - a);
push_L(a);
push_R(pop_L());
}
// add \/
// f(x) += abs(x - a)
void add_abs(const T &a) {
add_a_minus_x(a);
add_x_minus_a(a);
}
// \/ -> \_
// f_{new} (x) = min f(y) (y <= x)
void clear_right() {
while(not R.empty()) R.pop();
}
// \/ -> _/
// f_{new} (x) = min f(y) (y >= x)
void clear_left() {
while(not L.empty()) L.pop();
}
// \/ -> \_/
// f_{new} (x) = min f(y) (x-b <= y <= x-a)
void shift(const T &a, const T &b) {
assert(a <= b);
add_l += a;
add_r += b;
}
// \/. -> .\/
// f_{new} (x) = f(x - a)
void shift(const T &a) { shift(a, a); }
// L, R を破壊する
T get(const T &x) {
T ret = min_f;
while(not L.empty()) { ret += max(T(0), pop_L() - x); }
while(not R.empty()) { ret += max(T(0), x - pop_R()); }
return ret;
}
void merge(SlopeTrick &st) {
if(st.size() > size()) {
swap(st.L, L);
swap(st.R, R);
swap(st.add_l, add_l);
swap(st.add_r, add_r);
swap(st.min_f, min_f);
}
while(not st.R.empty()) { add_x_minus_a(st.pop_R()); }
while(not st.L.empty()) { add_a_minus_x(st.pop_L()); }
min_f += st.min_f;
}
};
template <typename T> struct BinaryIndexedTree {
vector<T> data;
BinaryIndexedTree(int sz) { data.assign(++sz, 0); }
T sum(int k) {
T ret = 0;
for(++k; k > 0; k -= k & -k) ret += data[k];
return (ret);
}
void add(int k, T x) {
for(++k; k < data.size(); k += k & -k) data[k] += x;
}
};
#define BIT BinaryIndexedTree
template <typename T> long long inversion(vector<T> a, bool is_zip = true) {
if(!is_zip) {
vector<T> id(a.size());
for(int i = 0; i < a.size(); ++i) id[i] = a[i];
sort(id.begin(), id.end());
for(int i = 0; i < a.size(); ++i) a[i] = lower_bound(id.begin(), id.end(), a[i]) - id.begin();
}
BIT<int> bbit(a.size() + 1);
long long res = (long long)a.size() * (a.size() - 1) / 2;
for(int i = 0; i < a.size(); ++i) {
res -= bbit.sum(a[i]);
bbit.add(a[i], 1);
}
return res;
}
int main() {
auto solve = [](vl v) {
SlopeTrick<ll> spt;
fore(e, v) {
spt.clear_right();
spt.add_abs(e);
}
return spt.query().min_f;
};
TEST {
INT(n, k);
VEC(ll, a, n);
if(k == 1) {
OUT(solve(a));
} else if(k == n) {
ll mi = inf<ll>;
rep(n) {
chmin(mi, solve(a));
rotate(begin(a), rng(a, 1, n));
}
OUT(mi);
} else if(k & 1) {
vpl v;
rep(i, n) v.eb(a[i], i);
SORT(v);
SORT(a);
vl w;
rep(i, n) w.eb(v[i].se);
ll mi = inf<ll>;
rep(i, n - 1) chmin(mi, a[i + 1] - a[i]);
if(inversion(w) & 1)
OUT(mi);
else
OUT(0);
} else {
OUT(0);
}
}
}
这程序好像有点Bug,我给组数据试试?
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3856kb
input:
4 4 1 6 4 3 7 4 2 6 4 3 7 4 3 6 4 3 7 4 4 6 4 3 7
output:
3 0 1 2
result:
ok 4 number(s): "3 0 1 2"
Test #2:
score: 0
Accepted
time: 9ms
memory: 3892kb
input:
10000 4 3 524728 254456 277709 19127 15 11 360089 525234 862619 897281 336644 910706 75922 708901 754517 734744 94169 326125 746826 846063 159956 4 2 140105 792522 40264 514789 12 2 270333 888927 500833 9065 936673 982631 332435 751429 607700 840339 804685 416612 8 7 119416 689632 517277 673646 8262...
output:
23253 7691 0 0 15986 278544 0 0 0 0 0 2022 0 0 0 9260 0 0 51255 0 0 277173 480146 0 658 4525 0 0 0 0 0 266148 0 767231 5853 0 0 121885 0 788638 0 0 0 779611 0 5881 0 0 0 0 517074 0 0 0 210836 454586 662851 0 781542 0 0 864957 175421 0 0 0 0 0 0 0 541010 0 0 15407 0 0 3413333 0 0 0 0 19677 30305 3095...
result:
ok 10000 numbers
Test #3:
score: 0
Accepted
time: 9ms
memory: 3600kb
input:
10000 1 1 2246872 10 1 6956989 9799253 5103131 200665 8599026 7743840 6622177 9299599 4771199 2388897 1 1 4115997 2 1 2246219 2946703 1 1 8870887 5 4 4465846 6917492 4431029 8967539 33631 11 11 5721411 592798 6930331 6862401 4082972 2094477 1505423 2091687 9125024 8518457 361077 4 2 8818946 4073615 ...
output:
0 23312638 0 0 0 0 17919297 0 543116 0 0 783241 0 44991 0 0 0 4721212 0 11367749 0 0 421992 0 4267974 0 0 0 0 0 0 0 0 1172214 0 0 0 0 0 9209019 0 0 5365348 922347 463528 10588447 0 0 0 2144103 17190623 19634388 142708 6877382 0 0 0 0 0 0 0 0 0 1477236 0 0 0 0 0 0 820573 0 0 0 3767488 8960620 0 10561...
result:
ok 10000 numbers
Test #4:
score: 0
Accepted
time: 9ms
memory: 3640kb
input:
10000 2 1 45149197 33261068 5 1 55118470 16401191 17389202 89510782 34998353 5 5 63464501 21878886 62995140 27832883 54891420 7 2 85638582 825401 81784814 21532809 30150850 21800436 94882138 2 2 83299527 63718695 3 1 89482904 64518505 91301116 1 1 82256621 1 1 30148988 3 1 68107859 50635233 8682010 ...
output:
11888129 93229708 35162257 0 0 24964399 0 0 59425849 0 22479259 5248308 0 0 0 41327792 0 207654 0 0 0 0 0 0 68210620 0 0 194925 0 0 73467281 33859825 122226 74005621 26201400 0 119179402 0 0 0 0 0 0 0 816171 0 0 0 25910307 3451662 0 4390900 0 0 0 22895459 0 0 0 102364933 0 346465 0 0 0 0 0 58190487 ...
result:
ok 10000 numbers
Test #5:
score: 0
Accepted
time: 9ms
memory: 3884kb
input:
10000 3 2 171561989 326460559 568826834 4 1 606735910 34072129 203284467 873417326 1 1 436249551 3 2 866901680 525830568 142746353 14 11 742357529 676987595 673771185 430647518 327098063 734643932 300528112 859509055 593973771 842011838 467635682 368399037 810057370 576054534 3 2 822197945 247906143...
output:
0 572663781 0 0 3216410 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 696031608 0 559141551 975330575 0 0 0 0 8269118 0 1645243801 0 0 0 0 0 480200189 444013173 1223177234 0 17211999 0 0 0 364069727 178337070 5296068017 0 0 0 0 709411979 0 2420843006 192213554 238004067 0 0 0 0 0 0 0 0 2626223 249160097 1183427809 ...
result:
ok 10000 numbers
Test #6:
score: 0
Accepted
time: 32ms
memory: 3888kb
input:
10000 11 1 719994 371444 177473 165906 258003 388506 556396 344249 756298 954668 668450 37 1 154783 680471 27958 18537 684073 711211 924310 535353 766034 510375 800832 64509 814950 546211 134844 3096 877063 837800 722279 626142 168108 336054 747182 590551 161949 182719 495638 869503 252408 315050 73...
output:
1246424 7880204 1036121 8010082 4745853 18497805 5589959 3845644 68400 265726 6056838 7202823 250222 191468 0 15682644 2627976 25524438 8162775 8408018 23822003 11083830 6961866 3133712 1753363 7922672 9894486 13936678 134033 11202387 3724366 10564706 3652183 3657586 17282350 540513 0 11530473 0 397...
result:
ok 10000 numbers
Test #7:
score: 0
Accepted
time: 35ms
memory: 3908kb
input:
10000 47 1 523059617 328055632 781822408 940589336 455730858 863296197 437030049 658265760 184918189 919959759 734943860 873150203 125605001 626490418 539172080 208944909 697529825 878806549 470244556 457799266 672503197 560798341 691187776 875798951 961299047 680353009 720548746 61867822 924965167 ...
output:
11720848879 20340520024 12486685858 1461710069 6313943138 31665376872 5928212025 1808940644 3787048058 2036744900 1426130451 2146871925 11531760949 4856941583 1425720379 2321337929 1320345528 1327213403 1405424545 8384107070 18369882866 11356718569 0 5267428466 636832484 16157808062 22122796995 6468...
result:
ok 10000 numbers
Test #8:
score: 0
Accepted
time: 51ms
memory: 11960kb
input:
1 300000 1 651102162 912784062 280750844 923640913 5054227 251711260 332945151 660425685 157943264 621946056 560328273 748436147 275105264 126861296 617420574 581173721 857525507 142861415 241368020 281859612 367236952 16104994 157324711 178667188 39607861 614078909 490652942 864292286 305586786 135...
output:
74906657059416
result:
ok 1 number(s): "74906657059416"
Test #9:
score: 0
Accepted
time: 24ms
memory: 7608kb
input:
1 100000 3 602375124 875161080 566363405 109583770 377899457 133319437 709759298 996340891 319888403 539626667 428135630 351615811 924398920 83068878 810553330 758478111 982972289 862464949 529972433 57016896 968624390 364490851 764434932 444421051 683535040 10290976 549700807 263440426 278436542 86...
output:
0
result:
ok 1 number(s): "0"
Test #10:
score: 0
Accepted
time: 14ms
memory: 3920kb
input:
2000 31 3 698810268 462004468 967891238 433071494 190111534 782757983 927040377 733347091 50578740 573583315 417745137 643098900 938483951 301712753 279989662 232161232 536757345 660117956 31789717 511162930 3842769 548739126 343996527 258630727 230356299 750829976 945790410 493372865 997436190 6316...
output:
0 4951 0 0 347770 15452560 5060292 6992 0 2720779 0 0 0 882725 53291879 0 939124 33861516 4405688 0 1781066 186310 28661615 7484769 0 0 28536937 0 1706581 580060 0 13419408 0 1909152 931874 1062952 230576 0 0 0 0 0 0 0 4263895 69366 1426433 0 0 0 0 642345 142664 0 0 2956752 513249 0 0 2993400 0 3895...
result:
ok 2000 numbers
Test #11:
score: 0
Accepted
time: 7ms
memory: 3916kb
input:
1 100000 2 477476356 94013914 625859012 730906024 611051981 241413132 629052354 340768318 842017659 956572518 612192775 286707518 859673844 186614005 442273229 796755030 179975139 893706537 184792656 362272473 138300473 94847574 221835090 267842108 416763558 818622772 70940568 971541146 497308964 29...
output:
0
result:
ok 1 number(s): "0"
Test #12:
score: 0
Accepted
time: 10ms
memory: 3628kb
input:
2000 26 2 924003662 871229099 358864902 330638562 825068362 163072451 54148927 515858219 543157954 724050502 993751520 272486178 839501706 220518782 220448393 36073704 527761327 75640326 325605198 974218035 740338158 430636621 569817145 280599500 428848698 961283863 58 2 822664646 398219282 18343378...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
ok 2000 numbers
Test #13:
score: 0
Accepted
time: 7ms
memory: 3536kb
input:
18555 1 1 1 1 1 2 1 1 3 1 1 4 1 1 5 2 1 1 1 2 2 1 1 2 1 1 2 2 2 1 2 2 1 1 3 2 2 1 3 2 1 1 4 2 2 1 4 2 1 1 5 2 2 1 5 2 1 2 1 2 2 2 1 2 1 2 2 2 2 2 2 2 1 2 3 2 2 2 3 2 1 2 4 2 2 2 4 2 1 2 5 2 2 2 5 2 1 3 1 2 2 3 1 2 1 3 2 2 2 3 2 2 1 3 3 2 2 3 3 2 1 3 4 2 2 3 4 2 1 3 5 2 2 3 5 2 1 4 1 2 2 4 1 2 1 4 2 ...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 0 0 0 3 0 2 0 1 0 0 0 0 0 4 0 3 0 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 1 0 0 0 0 0 0 0 0 0 3 0 0 2 0 1 1 0 1 0 0 0 0 0 0 4 0 0 3 0 1 2 0 2 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 0 0 0 0 ...
result:
ok 18555 numbers
Test #14:
score: 0
Accepted
time: 20ms
memory: 7608kb
input:
1 100000 3 103670965 730988733 612690321 859510898 495420570 617006158 930838259 781270919 815385999 657404732 838079716 160695659 234318868 13088314 849798902 74279803 560806478 676215272 38150915 858044286 667276814 994119002 698379276 449347578 713488988 862195451 930978455 362968914 387608599 23...
output:
1
result:
ok 1 number(s): "1"
Test #15:
score: 0
Accepted
time: 22ms
memory: 3608kb
input:
1 547 547 887954172 384424822 567917975 563531012 392348181 376515730 505356706 322940528 557433012 539277779 668097503 50062339 993650038 144040651 646365158 970239629 830237517 873351107 148978812 731914101 440991373 825216126 275919951 769751372 819414582 351059 208172908 119263053 998452139 5550...
output:
132549084799
result:
ok 1 number(s): "132549084799"
Test #16:
score: 0
Accepted
time: 22ms
memory: 3896kb
input:
1 546 546 4305572 374272421 88147916 554446056 930778731 238301666 878297114 646261853 194755102 312781870 225149932 872612884 331270197 903800554 944512335 156116735 840475042 491427606 984195 990974885 73381054 192504546 4969187 310585949 951311970 425024295 590896048 818902913 464200784 158688832...
output:
127477085741
result:
ok 1 number(s): "127477085741"
Test #17:
score: 0
Accepted
time: 2ms
memory: 3872kb
input:
100 157 23 846216104 325976483 76823620 279509806 242790881 9676858 792345559 322056553 632488502 444723554 70422962 27172325 26697435 40309279 992120464 751627327 499482549 277429832 736386595 471708200 940778720 417787658 306890639 248789992 1849130 203226467 672298989 938207958 331602581 31374660...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18748 0 0 0 44618 0 0 1734 0 0 0 37551 0 0 0 0 9738 79158 497404 0 0 0 0 0 0 0 0 32019 0 0 123787 10539 178749 0 0 0 86176 0 115850 34488 0 0 0 0 153492 0 0 0 0 0 0 0 1010455 0 363342 60486 0 233210 0 0 0 0 1145801 0 0 93911 0 0 0 0 0 0 0 0 17885 0 0 0 0 0 0 0 0 320335
result:
ok 100 numbers
Test #18:
score: 0
Accepted
time: 2ms
memory: 3696kb
input:
10 1928 24 971407775 628894325 731963982 822804784 450968417 430302156 982631932 161735902 880895728 923078537 707723857 189330739 910286918 802329211 404539679 303238506 317063340 492686568 773361868 125660016 650287940 839296263 462224593 492601449 384836991 191890310 576823355 782177068 404011431...
output:
0 0 1065 0 0 0 75358 0 39 5
result:
ok 10 numbers
Extra Test:
score: 0
Extra Test Passed