답안 #272787

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
272787 2020-08-18T15:29:05 Z egekabas Permutation Recovery (info1cup17_permutation) C++14
60 / 100
4000 ms 17816 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 = 2987623948576237;
ll n;
ll a[70009];
vector<pll> v[70009];
unordered_map<ll, ll> val[70009];
    
ll ans[70009];
char s[70009];
ll tmp[70009];
int main() {
    //ios_base::sync_with_stdio(false);
    //cin.tie(nullptr);
    
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    
    scanf("%lld", &n);
    for(ll i = 1; i <= n; ++i){
        scanf("%s", s);
        for(int j = 0; s[j] != '\0'; ++j){
            a[i] = a[i]*10%mod;
            a[i] += s[j]-'0';
            if(a[i] >= mod)
                a[i]-=mod;
        }
    }

    for(ll i = n; i >= 1; --i){
        a[i] = a[i]-a[i-1]+mod;
        if(a[i] >= mod)
            a[i] -= mod;
    }
    for(ll i = 1; i <= n; ++i){
        ll lookfor = a[i]-1;
        for(ll j = 0;; ++j){
            if(a[i] == 1 || val[j][lookfor]){
                ll seg = j, idx = val[j][lookfor]-1, num = i;
                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)
                    val[seg].erase(v[seg][i].ff);      
                val[seg][seg[v][idx+1].ff] = idx+2;
                for(int i = idx+2; i < v[seg].size(); ++i){
                    v[seg][i].ff = (a[v[seg][i].ss]+v[seg][i-1].ff);
                    if(v[seg][i].ff >= mod)
                        v[seg][i].ff -= mod;
                    val[seg][v[seg][i].ff] = i+1;
                    //cout << i << " -- " << v[seg][i].ff << '\n';
                }
                
                break;
            }
            lookfor = lookfor-v[j].back().ff+mod;
            if(lookfor >= mod)
                lookfor -= mod;
        }
        if(i%1000 == 0){
            ll tmpcnt = 0;
            for(ll i = 0; v[i].size(); ++i){
                val[i].clear();
                for(auto u : v[i])
                    tmp[tmpcnt++] = (u.ss);
                v[i].clear();
            }
            for(ll i = 0; i < tmpcnt; ++i){
                if(v[i/sq].empty())
                    v[i/sq].pb({a[tmp[i]], tmp[i]});
                else
                    v[i/sq].pb({(a[tmp[i]]+v[i/sq].back().ff)%mod, tmp[i]});    
                
                val[i/sq][v[i/sq].back().ff] = v[i/sq].size();
            }
        }
    }
    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){
        printf("%lld ", ans[i]);
    }
}

Compilation message

permutation.cpp: In function 'int main()':
permutation.cpp:57:38: 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]
   57 |                 for(int i = idx+2; i < v[seg].size(); ++i)
      |                                    ~~^~~~~~~~~~~~~~~
permutation.cpp:60:38: 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]
   60 |                 for(int i = idx+2; i < v[seg].size(); ++i){
      |                                    ~~^~~~~~~~~~~~~~~
permutation.cpp:32:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   32 |     scanf("%lld", &n);
      |     ~~~~~^~~~~~~~~~~~
permutation.cpp:34:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   34 |         scanf("%s", s);
      |         ~~~~~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5760 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5760 KB Output is correct
2 Correct 9 ms 5888 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5760 KB Output is correct
2 Correct 9 ms 5888 KB Output is correct
3 Correct 14 ms 5888 KB Output is correct
4 Correct 6 ms 5888 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5760 KB Output is correct
2 Correct 9 ms 5888 KB Output is correct
3 Correct 14 ms 5888 KB Output is correct
4 Correct 6 ms 5888 KB Output is correct
5 Correct 1593 ms 13516 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5760 KB Output is correct
2 Correct 9 ms 5888 KB Output is correct
3 Correct 14 ms 5888 KB Output is correct
4 Correct 6 ms 5888 KB Output is correct
5 Correct 1593 ms 13516 KB Output is correct
6 Execution timed out 4090 ms 17816 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5760 KB Output is correct
2 Correct 9 ms 5888 KB Output is correct
3 Correct 14 ms 5888 KB Output is correct
4 Correct 6 ms 5888 KB Output is correct
5 Correct 1593 ms 13516 KB Output is correct
6 Execution timed out 4090 ms 17816 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5760 KB Output is correct
2 Correct 9 ms 5888 KB Output is correct
3 Correct 14 ms 5888 KB Output is correct
4 Correct 6 ms 5888 KB Output is correct
5 Correct 1593 ms 13516 KB Output is correct
6 Execution timed out 4090 ms 17816 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5760 KB Output is correct
2 Correct 9 ms 5888 KB Output is correct
3 Correct 14 ms 5888 KB Output is correct
4 Correct 6 ms 5888 KB Output is correct
5 Correct 1593 ms 13516 KB Output is correct
6 Execution timed out 4090 ms 17816 KB Time limit exceeded