답안 #270537

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
270537 2020-08-17T17:46:49 Z egekabas Permutation Recovery (info1cup17_permutation) C++14
25 / 100
2 ms 2048 KB
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pull;
typedef pair<int, int> pii;
typedef pair<ld, ld> pld;
ll sq = 300;
ll mod = 1e16+7;
ll n;
ll a[70009];
vector<pll> v[70009];
ll tot[70009];
void add(ll seg, ll idx, ll num){
    tot[seg] = (tot[seg]+a[num])%mod;
    if(idx == -1)
        v[seg].insert(v[seg].begin()+idx+1, {a[num], num});
    else
        v[seg].insert(v[seg].begin()+idx+1, {(seg[v][idx].ff+a[num])%mod, num});
    for(int i = idx+2; i < v[seg].size(); ++i){
        v[seg][i].ff = (a[v[seg][i].ss]+v[seg][i-1].ff)%mod;
    }
}
void restruct(){
    vector<ll> tmp;
    for(ll i = 0; v[i].size(); ++i){
        for(auto u : v[i])
            tmp.pb(u.ss);
        v[i].clear();
        tot[i] = 0;
    }
    for(ll i = 0; i < tmp.size(); ++i)
        add(i/sq, v[i/sq].size()-1, tmp[i]);
}
ll ans[70009];
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    
    cin >> n;
    for(ll i = 1; i <= n; ++i){
        string s;
        cin >> s;
        for(auto u : s){
            a[i] = a[i]*10%mod;
            a[i] += u-'0';
            if(a[i] >= mod)
                a[i]-=mod;
        }
    }
    for(ll i = n; i >= 1; --i)
        a[i] = (a[i]-a[i-1]+mod)%mod;
    for(ll i = 1; i <= n; ++i){
        
        ll lookfor = a[i]-1;
        for(ll j = 0;; ++j){
            ll idx = lower_bound(all(v[j]), mp(lookfor, 0LL))-v[j].begin();
            if(a[i] == 1 || (idx != v[j].size()&&v[j][idx].ff==lookfor)){
                if(a[i] == 1) idx = -1;
                add(j, idx, i);
                if(v[j].size() == 2*sq)
                    restruct();
                break;
            }
            lookfor = (lookfor-tot[j]+mod)%mod;
            if(v[j].empty()) break;
        }
    }
    ll cur = 1;
    for(ll i = 0; v[i].size(); ++i)
        for(auto u : v[i])
            ans[u.ss] = cur++;
    for(ll i = 1; i <= n; ++i)
        cout << ans[i] << ' ';
}

Compilation message

permutation.cpp: In function 'void add(ll, ll, ll)':
permutation.cpp:27:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |     for(int i = idx+2; i < v[seg].size(); ++i){
      |                        ~~^~~~~~~~~~~~~~~
permutation.cpp: In function 'void restruct()':
permutation.cpp:39:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |     for(ll i = 0; i < tmp.size(); ++i)
      |                   ~~^~~~~~~~~~~~
permutation.cpp: In function 'int main()':
permutation.cpp:68:34: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |             if(a[i] == 1 || (idx != v[j].size()&&v[j][idx].ff==lookfor)){
      |                              ~~~~^~~~~~~~~~~~~~
permutation.cpp:71:32: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   71 |                 if(v[j].size() == 2*sq)
      |                    ~~~~~~~~~~~~^~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1920 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1920 KB Output is correct
2 Correct 2 ms 2048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1920 KB Output is correct
2 Correct 2 ms 2048 KB Output is correct
3 Incorrect 2 ms 2048 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1920 KB Output is correct
2 Correct 2 ms 2048 KB Output is correct
3 Incorrect 2 ms 2048 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1920 KB Output is correct
2 Correct 2 ms 2048 KB Output is correct
3 Incorrect 2 ms 2048 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1920 KB Output is correct
2 Correct 2 ms 2048 KB Output is correct
3 Incorrect 2 ms 2048 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1920 KB Output is correct
2 Correct 2 ms 2048 KB Output is correct
3 Incorrect 2 ms 2048 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1920 KB Output is correct
2 Correct 2 ms 2048 KB Output is correct
3 Incorrect 2 ms 2048 KB Output isn't correct
4 Halted 0 ms 0 KB -