提出 #70488289
ソースコード 拡げる
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <complex>
#include <deque>
#include <forward_list>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iostream>
#include <limits>
#include <list>
#include <map>
#include <memory>
#include <numeric>
#include <optional>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <tuple>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
using lint = long long;
using pint = pair<int, int>;
using plint = pair<lint, lint>;
struct fast_ios { fast_ios(){ cin.tie(nullptr), ios::sync_with_stdio(false), cout << fixed << setprecision(20); }; } fast_ios_;
#define ALL(x) (x).begin(), (x).end()
#define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i<i##_end_;i++)
#define IFOR(i, begin, end) for(int i=(end)-1,i##_begin_=(begin);i>=i##_begin_;i--)
#define REP(i, n) FOR(i,0,n)
#define IREP(i, n) IFOR(i,0,n)
template <typename T> bool chmax(T &m, const T q) { return m < q ? (m = q, true) : false; }
template <typename T> bool chmin(T &m, const T q) { return m > q ? (m = q, true) : false; }
const std::vector<std::pair<int, int>> grid_dxs{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int floor_lg(long long x) { return x <= 0 ? -1 : 63 - __builtin_clzll(x); }
template <class T1, class T2> T1 floor_div(T1 num, T2 den) { return (num > 0 ? num / den : -((-num + den - 1) / den)); }
template <class T1, class T2> std::pair<T1, T2> operator+(const std::pair<T1, T2> &l, const std::pair<T1, T2> &r) { return std::make_pair(l.first + r.first, l.second + r.second); }
template <class T1, class T2> std::pair<T1, T2> operator-(const std::pair<T1, T2> &l, const std::pair<T1, T2> &r) { return std::make_pair(l.first - r.first, l.second - r.second); }
template <class T> std::vector<T> sort_unique(std::vector<T> vec) { sort(vec.begin(), vec.end()), vec.erase(unique(vec.begin(), vec.end()), vec.end()); return vec; }
template <class T> int arglb(const std::vector<T> &v, const T &x) { return std::distance(v.begin(), std::lower_bound(v.begin(), v.end(), x)); }
template <class T> int argub(const std::vector<T> &v, const T &x) { return std::distance(v.begin(), std::upper_bound(v.begin(), v.end(), x)); }
template <class IStream, class T> IStream &operator>>(IStream &is, std::vector<T> &vec) { for (auto &v : vec) is >> v; return is; }
template <class OStream, class T> OStream &operator<<(OStream &os, const std::vector<T> &vec);
template <class OStream, class T, size_t sz> OStream &operator<<(OStream &os, const std::array<T, sz> &arr);
template <class OStream, class T, class TH> OStream &operator<<(OStream &os, const std::unordered_set<T, TH> &vec);
template <class OStream, class T, class U> OStream &operator<<(OStream &os, const pair<T, U> &pa);
template <class OStream, class T> OStream &operator<<(OStream &os, const std::deque<T> &vec);
template <class OStream, class T> OStream &operator<<(OStream &os, const std::set<T> &vec);
template <class OStream, class T> OStream &operator<<(OStream &os, const std::multiset<T> &vec);
template <class OStream, class T> OStream &operator<<(OStream &os, const std::unordered_multiset<T> &vec);
template <class OStream, class T, class U> OStream &operator<<(OStream &os, const std::pair<T, U> &pa);
template <class OStream, class TK, class TV> OStream &operator<<(OStream &os, const std::map<TK, TV> &mp);
template <class OStream, class TK, class TV, class TH> OStream &operator<<(OStream &os, const std::unordered_map<TK, TV, TH> &mp);
template <class OStream, class... T> OStream &operator<<(OStream &os, const std::tuple<T...> &tpl);
template <class OStream, class T> OStream &operator<<(OStream &os, const std::vector<T> &vec) { os << '['; for (auto v : vec) os << v << ','; os << ']'; return os; }
template <class OStream, class T, size_t sz> OStream &operator<<(OStream &os, const std::array<T, sz> &arr) { os << '['; for (auto v : arr) os << v << ','; os << ']'; return os; }
template <class... T> std::istream &operator>>(std::istream &is, std::tuple<T...> &tpl) { std::apply([&is](auto &&... args) { ((is >> args), ...);}, tpl); return is; }
template <class OStream, class... T> OStream &operator<<(OStream &os, const std::tuple<T...> &tpl) { os << '('; std::apply([&os](auto &&... args) { ((os << args << ','), ...);}, tpl); return os << ')'; }
template <class OStream, class T, class TH> OStream &operator<<(OStream &os, const std::unordered_set<T, TH> &vec) { os << '{'; for (auto v : vec) os << v << ','; os << '}'; return os; }
template <class OStream, class T> OStream &operator<<(OStream &os, const std::deque<T> &vec) { os << "deq["; for (auto v : vec) os << v << ','; os << ']'; return os; }
template <class OStream, class T> OStream &operator<<(OStream &os, const std::set<T> &vec) { os << '{'; for (auto v : vec) os << v << ','; os << '}'; return os; }
template <class OStream, class T> OStream &operator<<(OStream &os, const std::multiset<T> &vec) { os << '{'; for (auto v : vec) os << v << ','; os << '}'; return os; }
template <class OStream, class T> OStream &operator<<(OStream &os, const std::unordered_multiset<T> &vec) { os << '{'; for (auto v : vec) os << v << ','; os << '}'; return os; }
template <class OStream, class T, class U> OStream &operator<<(OStream &os, const std::pair<T, U> &pa) { return os << '(' << pa.first << ',' << pa.second << ')'; }
template <class OStream, class TK, class TV> OStream &operator<<(OStream &os, const std::map<TK, TV> &mp) { os << '{'; for (auto v : mp) os << v.first << "=>" << v.second << ','; os << '}'; return os; }
template <class OStream, class TK, class TV, class TH> OStream &operator<<(OStream &os, const std::unordered_map<TK, TV, TH> &mp) { os << '{'; for (auto v : mp) os << v.first << "=>" << v.second << ','; os << '}'; return os; }
#ifdef HITONANODE_LOCAL
const string COLOR_RESET = "\033[0m", BRIGHT_GREEN = "\033[1;32m", BRIGHT_RED = "\033[1;31m", BRIGHT_CYAN = "\033[1;36m", NORMAL_CROSSED = "\033[0;9;37m", RED_BACKGROUND = "\033[1;41m", NORMAL_FAINT = "\033[0;2m";
#define dbg(x) std::cerr << BRIGHT_CYAN << #x << COLOR_RESET << " = " << (x) << NORMAL_FAINT << " (L" << __LINE__ << ") " << __FILE__ << COLOR_RESET << std::endl
#define dbgif(cond, x) ((cond) ? std::cerr << BRIGHT_CYAN << #x << COLOR_RESET << " = " << (x) << NORMAL_FAINT << " (L" << __LINE__ << ") " << __FILE__ << COLOR_RESET << std::endl : std::cerr)
#else
#define dbg(x) ((void)0)
#define dbgif(cond, x) ((void)0)
#endif
#include <algorithm>
#include <memory>
#include <vector>
enum class LisType {
StrictlyIncreasing,
Nondecreasing,
};
// Calculate (only) length of longest increasing subsequence (LIS)
// Complexity: O(n log n)
template <class T>
int lis_length(const std::vector<T> &seq, LisType lis_type = LisType::StrictlyIncreasing) {
std::vector<T> dp;
for (const T &x : seq) {
if (auto itr = (lis_type == LisType::StrictlyIncreasing
? std::lower_bound(begin(dp), end(dp), x)
: std::upper_bound(begin(dp), end(dp), x));
itr == end(dp)) {
dp.push_back(x);
} else {
*itr = x;
}
}
return dp.size();
}
template <class T> struct longest_increasing_subsequence {
LisType lis_type_ = LisType::StrictlyIncreasing;
int current_idx = 0;
struct Node {
std::shared_ptr<Node> par;
int len, idx;
T v;
};
std::vector<T> dp;
std::vector<std::shared_ptr<Node>> ptrs;
// Complexity: O(1)
longest_increasing_subsequence(LisType lis_type) : lis_type_(lis_type) {}
// Complexity: O(N log N)
longest_increasing_subsequence(const std::vector<T> &seq, LisType lis_type)
: lis_type_(lis_type) {
for (const T &x : seq) add(x);
}
// Complexity: O(log N)
std::shared_ptr<Node> add(const T &x) {
auto itr =
(lis_type_ == LisType::StrictlyIncreasing ? std::lower_bound(begin(dp), end(dp), x)
: std::upper_bound(begin(dp), end(dp), x));
int cur = std::distance(begin(dp), itr);
std::shared_ptr<Node> prv = (begin(dp) == itr ? nullptr : ptrs.at(cur - 1));
std::shared_ptr<Node> node(
new Node{prv, (prv == nullptr ? 0 : prv->len) + 1, current_idx++, x});
if (itr == end(dp)) {
dp.push_back(x), ptrs.push_back(node);
} else {
dp.at(cur) = x, ptrs.at(cur) = node;
}
return node;
}
std::shared_ptr<Node> head() const { return ptrs.empty() ? nullptr : ptrs.back(); }
// LIS をなす添字列を出力
// Complexity: O(N)
std::vector<int> get_lis_indices() const {
std::vector<int> ret;
for (auto ptr = head(); ptr != nullptr; ptr = ptr->par) ret.push_back(ptr->idx);
std::reverse(ret.begin(), ret.end());
return ret;
}
};
#include <chrono>
#include <random>
struct rand_int_ {
using lint = long long;
std::mt19937 mt;
rand_int_() : mt(42) {}
// rand_int_() : mt(std::chrono::steady_clock::now().time_since_epoch().count()) {}
lint operator()(lint x) { return this->operator()(0, x); } // [0, x)
lint operator()(lint l, lint r) {
std::uniform_int_distribution<lint> d(l, r - 1);
return d(mt);
}
} rnd;
void Solve(int N) {
// constexpr int W = 10;
int W = 1;
while ((1 << W) < N) ++W;
vector<int> P;
int stride = 0;
int cap = 1;
REP(i, N) {
const int a = ((1 << W) - 1 - i);
assert(0 <= a and a < (1 << W));
// const int b = (1 << W) - 1 - (1 << stride);
// assert(0 <= b and b < (1 << W));
const int b = rnd(1 << W);
--cap;
if (cap == 0) {
stride++;
cap = 1 << stride;
}
const int c = i;
assert(0 <= c and c < (1 << W));
const int w = (((a << W) + b) << W) + c;
P.push_back(w);
}
map<int, int> mp;
REP(S, 1 << (W * 2)) {
const int a = S << W;
vector<int> Q;
for (auto p : P) Q.push_back(p | a);
auto l = lis_length(Q);
// if (!mp.contains(l)) dbg(make_tuple(S, l));
mp[l]++;
}
dbg(N);
dbg(mp);
// vector<int> A;
// REP(i, N) {
// const int a = 1024 - 1;
// }
}
void Solver(int N) {
vector<int> seq{N};
while (seq.back() > 2) {
int r = seq.back();
seq.push_back((r - 1) / 2);
}
reverse(ALL(seq));
vector<string> dp;
vector<int> masks;
if (seq.front() == 1) {
dp = {"0"};
masks = {0, 0};
} else if (seq.front() == 2) {
dp = {"00", "10"};
masks = {0, 2, 0};
} else {
assert(false);
}
FOR(d, 1, seq.size()) {
const int prv = seq.at(d - 1), now = seq.at(d);
const int base = 1 << dp.at(0).size();
vector<string> next_dp;
vector<int> next_masks(now + 1, -1);
if (now == prv * 2 + 1) {
for (auto s : dp) { next_dp.push_back("011" + s); }
next_dp.push_back("010" + string(dp.front().size(), '1'));
for (auto s : dp) { next_dp.push_back("110" + s); }
// next_dp.push_back("101" + string(dp.front().size(), '1'));
FOR(i, 1, masks.size()) {
if (next_masks.at(i) == -1) next_masks.at(i) = masks.at(i) + base * 4;
if (next_masks.at(i + 1) == -1) next_masks.at(i + 1) = masks.at(i) + base * 5;
if (next_masks.at(i * 2) == -1) next_masks.at(i * 2) = masks.at(i);
if (next_masks.at(i * 2 + 1) == -1) next_masks.at(i * 2 + 1) = masks.at(i) + base;
// if (next_masks.at(i * 2 + 2) == -1) next_masks.at(i * 2 + 2) = masks.at(i) + base * 3;
}
} else if (now == prv * 2 + 2) {
for (auto s : dp) { next_dp.push_back("011" + s); }
next_dp.push_back("010" + string(dp.front().size(), '1'));
for (auto s : dp) { next_dp.push_back("110" + s); }
next_dp.push_back("101" + string(dp.front().size(), '1'));
FOR(i, 1, masks.size()) {
if (next_masks.at(i) == -1) next_masks.at(i) = masks.at(i) + base * 4;
if (next_masks.at(i + 1) == -1) next_masks.at(i + 1) = masks.at(i) + base * 5;
if (next_masks.at(i * 2) == -1) next_masks.at(i * 2) = masks.at(i);
if (next_masks.at(i * 2 + 1) == -1) next_masks.at(i * 2 + 1) = masks.at(i) + base;
if (next_masks.at(i * 2 + 2) == -1) next_masks.at(i * 2 + 2) = masks.at(i) + base * 3;
}
} else {
assert(false);
}
dp = next_dp;
masks = next_masks;
}
for (auto a : dp) {
int ret = 0;
for (char c : a) ret = ret * 2 + (c - '0');
cout << ret << ' ';
}
cout << '\n';
FOR(i, 1, N + 1) cout << masks.at(i) << ' ';
cout << '\n';
}
int main() {
// FOR(n, 1, 64) Solve(n);
// vector<int> f{0b0110, 0b0111, 0b1000, 0b1100, 0b1010, 0b1011};
vector<int> f {
0b01100,
0b01110,
0b01011,
0b11000,
0b11010,
0b10111,
};
// for (int m : {0b10000, }) {
REP(m, 32) {
if (m % 4) continue;
// const int m = s * 2;
auto g = f;
for (auto &e : g) e = e | m;
dbg(make_tuple(m, lis_length(g)));
}
// Solve(1024);
int T;
cin >> T;
while (T--) {
int N;
cin >> N;
Solver(N);
}
}
提出情報
| 提出日時 |
|
| 問題 |
C - PORALIS |
| ユーザ |
hitonanode |
| 言語 |
C++ 20 (gcc 12.2) |
| 得点 |
0 |
| コード長 |
14010 Byte |
| 結果 |
WA |
| 実行時間 |
35 ms |
| メモリ |
3884 KiB |
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
0 / 900 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
00-sample-0.txt |
| All |
00-sample-0.txt, 01-00.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt, 01-36.txt, 01-37.txt, 01-38.txt, 01-39.txt, 01-40.txt, 01-41.txt, 01-42.txt, 01-43.txt, 01-44.txt, 01-45.txt, 01-46.txt, 01-47.txt, 01-48.txt, 01-49.txt, 01-50.txt, 01-51.txt, 01-52.txt, 01-53.txt, 01-54.txt, 01-55.txt, 01-56.txt, 01-57.txt, 01-58.txt, 01-59.txt, 01-60.txt, 01-61.txt, 01-62.txt, 01-63.txt, 01-64.txt, 01-65.txt, 01-66.txt, 01-67.txt, 01-68.txt, 01-69.txt, 01-70.txt, 01-71.txt, 01-72.txt, 01-73.txt, 01-74.txt, 01-75.txt, 01-76.txt, 01-77.txt, 01-78.txt, 01-79.txt, 01-80.txt, 01-81.txt, 01-82.txt, 01-83.txt, 02-0.txt, 03-0.txt, 03-1.txt, 03-2.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| 00-sample-0.txt |
WA |
1 ms |
3540 KiB |
| 01-00.txt |
WA |
3 ms |
3700 KiB |
| 01-01.txt |
WA |
2 ms |
3680 KiB |
| 01-02.txt |
WA |
2 ms |
3716 KiB |
| 01-03.txt |
WA |
2 ms |
3624 KiB |
| 01-04.txt |
WA |
3 ms |
3796 KiB |
| 01-05.txt |
WA |
2 ms |
3592 KiB |
| 01-06.txt |
WA |
2 ms |
3644 KiB |
| 01-07.txt |
WA |
2 ms |
3716 KiB |
| 01-08.txt |
WA |
2 ms |
3728 KiB |
| 01-09.txt |
WA |
2 ms |
3664 KiB |
| 01-10.txt |
WA |
2 ms |
3652 KiB |
| 01-11.txt |
WA |
2 ms |
3728 KiB |
| 01-12.txt |
WA |
2 ms |
3672 KiB |
| 01-13.txt |
WA |
3 ms |
3648 KiB |
| 01-14.txt |
WA |
2 ms |
3596 KiB |
| 01-15.txt |
WA |
3 ms |
3648 KiB |
| 01-16.txt |
WA |
2 ms |
3692 KiB |
| 01-17.txt |
WA |
3 ms |
3592 KiB |
| 01-18.txt |
WA |
2 ms |
3640 KiB |
| 01-19.txt |
WA |
2 ms |
3648 KiB |
| 01-20.txt |
WA |
2 ms |
3792 KiB |
| 01-21.txt |
WA |
2 ms |
3676 KiB |
| 01-22.txt |
WA |
2 ms |
3748 KiB |
| 01-23.txt |
WA |
3 ms |
3596 KiB |
| 01-24.txt |
WA |
2 ms |
3664 KiB |
| 01-25.txt |
WA |
2 ms |
3536 KiB |
| 01-26.txt |
WA |
2 ms |
3728 KiB |
| 01-27.txt |
WA |
3 ms |
3676 KiB |
| 01-28.txt |
WA |
2 ms |
3764 KiB |
| 01-29.txt |
WA |
2 ms |
3720 KiB |
| 01-30.txt |
WA |
2 ms |
3600 KiB |
| 01-31.txt |
WA |
2 ms |
3612 KiB |
| 01-32.txt |
WA |
2 ms |
3812 KiB |
| 01-33.txt |
WA |
3 ms |
3520 KiB |
| 01-34.txt |
WA |
2 ms |
3636 KiB |
| 01-35.txt |
WA |
2 ms |
3672 KiB |
| 01-36.txt |
WA |
2 ms |
3676 KiB |
| 01-37.txt |
WA |
2 ms |
3652 KiB |
| 01-38.txt |
WA |
3 ms |
3668 KiB |
| 01-39.txt |
WA |
2 ms |
3588 KiB |
| 01-40.txt |
WA |
2 ms |
3556 KiB |
| 01-41.txt |
WA |
2 ms |
3788 KiB |
| 01-42.txt |
WA |
2 ms |
3708 KiB |
| 01-43.txt |
WA |
2 ms |
3672 KiB |
| 01-44.txt |
WA |
2 ms |
3624 KiB |
| 01-45.txt |
WA |
2 ms |
3576 KiB |
| 01-46.txt |
WA |
2 ms |
3672 KiB |
| 01-47.txt |
WA |
2 ms |
3724 KiB |
| 01-48.txt |
WA |
2 ms |
3596 KiB |
| 01-49.txt |
WA |
2 ms |
3528 KiB |
| 01-50.txt |
WA |
2 ms |
3748 KiB |
| 01-51.txt |
WA |
2 ms |
3656 KiB |
| 01-52.txt |
WA |
2 ms |
3556 KiB |
| 01-53.txt |
WA |
2 ms |
3692 KiB |
| 01-54.txt |
WA |
2 ms |
3724 KiB |
| 01-55.txt |
WA |
2 ms |
3620 KiB |
| 01-56.txt |
WA |
2 ms |
3604 KiB |
| 01-57.txt |
WA |
3 ms |
3604 KiB |
| 01-58.txt |
WA |
2 ms |
3816 KiB |
| 01-59.txt |
WA |
2 ms |
3664 KiB |
| 01-60.txt |
WA |
2 ms |
3884 KiB |
| 01-61.txt |
WA |
2 ms |
3616 KiB |
| 01-62.txt |
WA |
2 ms |
3736 KiB |
| 01-63.txt |
WA |
2 ms |
3692 KiB |
| 01-64.txt |
WA |
2 ms |
3600 KiB |
| 01-65.txt |
WA |
2 ms |
3660 KiB |
| 01-66.txt |
WA |
3 ms |
3672 KiB |
| 01-67.txt |
WA |
2 ms |
3692 KiB |
| 01-68.txt |
WA |
2 ms |
3796 KiB |
| 01-69.txt |
WA |
2 ms |
3640 KiB |
| 01-70.txt |
WA |
2 ms |
3868 KiB |
| 01-71.txt |
WA |
3 ms |
3588 KiB |
| 01-72.txt |
WA |
2 ms |
3680 KiB |
| 01-73.txt |
WA |
3 ms |
3820 KiB |
| 01-74.txt |
WA |
2 ms |
3716 KiB |
| 01-75.txt |
WA |
2 ms |
3640 KiB |
| 01-76.txt |
WA |
2 ms |
3736 KiB |
| 01-77.txt |
WA |
2 ms |
3744 KiB |
| 01-78.txt |
WA |
3 ms |
3576 KiB |
| 01-79.txt |
WA |
2 ms |
3664 KiB |
| 01-80.txt |
WA |
2 ms |
3564 KiB |
| 01-81.txt |
WA |
2 ms |
3692 KiB |
| 01-82.txt |
WA |
3 ms |
3788 KiB |
| 01-83.txt |
WA |
2 ms |
3692 KiB |
| 02-0.txt |
WA |
4 ms |
3564 KiB |
| 03-0.txt |
AC |
35 ms |
3684 KiB |
| 03-1.txt |
WA |
35 ms |
3496 KiB |
| 03-2.txt |
WA |
33 ms |
3500 KiB |