#include <bits/stdc++.h>
using namespace std;
#define siz(x) (int)(x).size()
struct big_num{
vector <int> d;
big_num(int x = 0){
do{
d.push_back(x % 10);
x /= 10;
} while ( x > 0 );
}
big_num(vector <int> d) : d(d) {
while ( siz(d) > 1 && !d.back() ) d.pop_back();
}
big_num(string s){
d.resize(siz(s));
for ( int i = 0; i < siz(d); i++ ){
d[i] = s[siz(s) - i - 1] - '0';
}
}
big_num operator +(const big_num &q){
vector <int> ret(max(siz(d), siz(q.d)));
int v = 0;
for ( int i = 0; i < siz(ret); i++ ){
int x = (siz(d) > i ? d[i] : 0) + (siz(q.d) > i ? q.d[i] : 0) + v;
ret[i] = x % 10;
v = x / 10;
}
if ( v != 0 ) ret.push_back(v);
return big_num(ret);
}
bool operator ==(const big_num &q){ return d == q.d; }
bool operator >(const big_num &q){
if ( *this == q ) return false;
if ( siz(q.d) != siz(d) ) return siz(d) > siz(q.d);
for ( int i = 0; i < siz(d); i++ ){
if ( q.d[i] != d[i] ) return d[i] > q.d[i];
} assert(false);
}
bool operator <(const big_num &q){
return !(*this == q) && !(*this > q);
}
void print(){
for ( int i = siz(d) - 1; i >= 0; i-- ) cout << d[i] << ' ';
cout << '\n';
}
};
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin >> n;
vector <big_num> q(n);
for ( int i = 0; i < n; i++ ){
string s; cin >> s;
q[i] = big_num(s);
}
vector <big_num> dp(n);
vector <int> p;
big_num pf;
for ( int i = 0; i < n; i++ ){
dp[i] = {1};
int j = 0;
for (; j < siz(p); j++ ){
if ( dp[i] + pf == q[i] ) break;
dp[i] = dp[i] + dp[p[j]];
}
assert(dp[i] + pf == q[i]);
pf = pf + dp[i];
p.push_back(i);
for ( int k = i; k > j; k-- ) swap(p[k], p[k - 1]);
}
vector <int> pos(n);
for ( int i = 0; i < n; i++ ) pos[p[i]] = i;
for ( auto &x: pos ) cout << x + 1 << ' ';
cout << '\n';
};
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |