//Challenge: Accepted
#include <iostream>
#include <algorithm>
#include <utility>
#include <vector>
#define ll long long
#define maxn 70005
#define ff first
#define ss second
#define io ios_base::sync_with_stdio(0);cin.tie(0);
#define pii pair<int, int>
using namespace std;
const int bs = 64;
string q[maxn], b[maxn], c[maxn];
int a[maxn], found[maxn];
void print(string s) {
reverse(s.begin(), s.end());
int po = 1, ret = 0;
for (int i = 0;i < s.size();i++) {
ret += int(s[i]) * po;
po *= bs;
}
cout << ret << " ";
}
string operator *(string a, string b) { //addition
if (a == "a" || b == "a") return "a";
if (a.size() < b.size()) {
int d = b.size() - a.size();
for (int i = 0;i < d;i++) a += '\0';
} else {
int d = a.size() - b.size();
for (int i = 0;i < d;i++) b += '\0';
}
string ret;
int cur = 0, tmp = 0;
for (int i = 0;i < a.size();i++) {
cur = tmp;
cur += a[i] + b[i];
tmp = (cur >= bs ? (cur -= bs, 1) : 0);
ret += char(cur);
}
if (tmp) ret += '\1';
return ret;
}
string operator / (string a, string b) { //subtraction
if (a == "a") return a;
int d = a.size() - b.size();
for (int i = 0;i < d;i++) b += '\0';
string ret;
int cur = 0, tmp = 0;
for (int i = 0;i < a.size();i++) {
cur = tmp;
cur += a[i] - b[i];
ret += char(cur + (cur < 0 ? (tmp = -1, bs) : (tmp = 0, 0)));
}
while (ret.size() > 1 && ret[ret.size() - 1] == '\0') ret.pop_back();
return ret;
}
bool operator <= (string a, string b) {
if (a == "a") return false;
else if (b == "a") return true;
if (a.size() != b.size()) return a.size() < b.size();
for (int i = a.size() - 1;i >= 0;i--) {
if (a[i] != b[i]) return a[i] < b[i];
}
return true;
}
string tobase(string s) {
//cout << " " << s << endl;
string ret;
for (int i = s.size() - 1;i >= 0;i--) {
int cur = 0, tmp = 0;
string rep;
for (int j = 0;j < ret.size();j++) {
cur = tmp;
cur += ret[j] * 10;
if (cur >= bs) {
rep += char(cur % bs);
tmp = cur / bs;
}
}
if (cur) rep += char(cur);
ret = rep;
//print(ret);
//cout << endl;
string t;
t += s[i] - '0';
ret = ret * t;
}
return ret;
}
string seg[4 * maxn], tag[4 * maxn];
int mpos[4 * maxn];
void upd(int cur, int l, int r) {
string vl = seg[cur * 2] / tag[cur * 2], vr = seg[cur * 2 + 1] / tag[cur * 2 + 1];
if (vl.size() == 0) vl += '\0';
if (vr.size() == 0) vr += '\0';
if (vr <= vl) {
seg[cur] = vr;
mpos[cur] = mpos[cur * 2 + 1];
} else {
seg[cur] = vl;
mpos[cur] = mpos[cur * 2];
}
}
void dbg(int cur, int l, int r) {
if (r <= l) return;
if (r - l == 1) {
cout << l << " " << r << " " << mpos[cur] << "\n";
return;
}
int mid = (l + r) / 2;
dbg(cur * 2, l, mid);
dbg(cur * 2 + 1, mid, r);
cout << l << " " << r << " " << mpos[cur] << "\n";
}
void init(int cur, int l, int r) {
if (r <= l) return;
if (r - l == 1) {
seg[cur] = c[l];
mpos[cur] = l;
return;
}
int mid = (l + r) / 2;
init(cur * 2, l, mid);
init(cur * 2 + 1, mid, r);
upd(cur, l, r);
}
void remove(int cur, int l, int r, int ind) {
if (r <= l) return;
if (r - l == 1) {
seg[cur] = "a";
return;
}
int mid = (l + r) / 2;
if (ind < mid) remove(cur * 2, l, mid, ind);
else remove(cur * 2 + 1, mid, r, ind);
upd(cur, l, r);
}
void modify(int cur, int l, int r, int ql, int qr, string val) {
if (r <= l || qr <= l || ql >= r) return;
if (ql <= l && qr >= r) {
tag[cur] = tag[cur] * val;
return;
}
int mid = (l + r) / 2;
modify(cur * 2, l, mid, ql, qr, val);
modify(cur * 2 + 1, mid, r, ql, qr, val);
upd(cur, l, r);
}
int main() {
io
int n;
cin >> n;
for (int i = 0;i < n;i++) {
//string sx = tobase(x), sy = tobase(y);
//print(sx);
//print(sx * sy);
//print(sx / sy);
string s;
cin >> s;
reverse(s.begin(), s.end());
q[i] = tobase(s);
}
for (int i = 0;i < n;i++) {
b[i] = q[i] / (i ? q[i - 1] : "\0");
c[i] = (i ? (q[i - 1] * "\1") / b[i] : "\0");
}
init(1, 0, n);
//dbg(1, 0, n);
for (int i = 0;i < n;i++) {
int ind = mpos[1];
a[ind] = n - i;
remove(1, 0, n, ind);
modify(1, 0, n, ind + 1, n, b[ind]);
//dbg(1, 0, n);
}
for (int i = 0;i < n;i++) cout << a[i] << " ";
cout << "\n";
}
/*
4
1 2 5 6
6
1 3 5 9 11 21
*/
Compilation message
permutation.cpp: In function 'void print(std::string)':
permutation.cpp:20:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
20 | for (int i = 0;i < s.size();i++) {
| ~~^~~~~~~~~~
permutation.cpp: In function 'std::string operator*(std::string, std::string)':
permutation.cpp:39:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
39 | for (int i = 0;i < a.size();i++) {
| ~~^~~~~~~~~~
permutation.cpp: In function 'std::string operator/(std::string, std::string)':
permutation.cpp:54:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
54 | for (int i = 0;i < a.size();i++) {
| ~~^~~~~~~~~~
permutation.cpp: In function 'std::string tobase(std::string)':
permutation.cpp:78:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
78 | for (int j = 0;j < ret.size();j++) {
| ~~^~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
24396 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
24396 KB |
Output is correct |
2 |
Incorrect |
18 ms |
24396 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
24396 KB |
Output is correct |
2 |
Incorrect |
18 ms |
24396 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
24396 KB |
Output is correct |
2 |
Incorrect |
18 ms |
24396 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
24396 KB |
Output is correct |
2 |
Incorrect |
18 ms |
24396 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
24396 KB |
Output is correct |
2 |
Incorrect |
18 ms |
24396 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
24396 KB |
Output is correct |
2 |
Incorrect |
18 ms |
24396 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
24396 KB |
Output is correct |
2 |
Incorrect |
18 ms |
24396 KB |
Output isn't correct |