Submission #67770

#TimeUsernameProblemLanguageResultExecution timeMemory
67770MrTEKPermutation Recovery (info1cup17_permutation)C++14
Compilation error
0 ms0 KiB
#include <bits/stdc++.h> using namespace std; #define mp make_pair #define pb push_back #define len(a) (int)a.size() #define fi first #define sc second #define d1(w) cerr<<#w<<":"<<w<<endl; #define d2(w,c) cerr<<#w<<":"<<w<<" "<<#c<<":"<<c<<endl; #define d3(w,c,z) cerr<<#w<<":"<<w<<" "<<#c<<":"<<c<<" "<<#z<<":"<<z<<endl; #define left ind+ind #define right ind+ind+1 #define FAST_IO ios_base::sync_with_stdio(false); #define endl '\n' typedef long long int ll; const int maxn = 620; const long long LINF = 1e18; const int LOG = 31; const int INF = 1e9; const int N = 705; const int M = 60; const int SQ = 350; const int MOD = 998244353; #include <bits/stdc++.h> using namespace std; typedef int64_t ll; typedef long long ll; typedef pair<ll,ll> lll; typedef pair<ll,int> lli; typedef pair<int,int> ii; #define EL printf("\n") #define OK printf("OK") #define pb push_back #define mp make_pair #define ep emplace_back #define X first #define Y second #define fillchar(a,x) memset(a, x, sizeof(a)) #define FOR(i,l,r) for (int i=l;i<=r;i++) #define FORD(i,r,l) for (int i=r;i>=l;i--) const int base = 1e9; typedef vector<int> BigInt; void Set(BigInt &a) { while (a.size() > 1 && a.back() == 0) a.pop_back(); } void Print(BigInt a) { Set(a); printf("%d", (a.size() == 0) ? 0 : a.back()); FORD(i,a.size()-2,0) printf("%09d", a[i]); EL; } BigInt Integer(string s) { BigInt ans; if (s[0] == '-') return ans; if (s.size() == 0) {ans.pb(0); return ans;} while (s.size()%9 != 0) s = '0'+s; for (int i=0;i<s.size();i+=9) { int v = 0; for (int j=i;j<i+9;j++) v = v*10+(s[j]-'0'); ans.insert(ans.begin(),v); } Set(ans); return ans; } BigInt Integer(char c[]) { string s = ""; FOR(i,0,strlen(c)-1) s = s + c[i]; return Integer(s); } BigInt Integer(ll x) { string s = ""; while (x > 0) s = char(x%10+'0') + s, x /= 10; return Integer(s); } BigInt Integer(int x) { return Integer((ll) x); } void operator >> (istream &in, BigInt &a) { string s; getline(cin, s); a = Integer(s); } void operator << (ostream &out, BigInt a) { Print(a); } bool operator < (BigInt a, BigInt b) { Set(a); Set(b); if (a.size() != b.size()) return (a.size() < b.size()); FORD(i,a.size()-1,0) if (a[i] != b[i]) return (a[i] < b[i]); return false; } bool operator > (BigInt a, BigInt b) { return (b < a); } bool operator == (BigInt a, BigInt b) { return (!(a < b) && !(b < a)); } bool operator <= (BigInt a, BigInt b) { return (a < b || a == b); } bool operator >= (BigInt a, BigInt b) { return (b < a || b == a); } bool operator < (BigInt a, int b) { return (a < Integer(b)); } bool operator > (BigInt a, int b) { return (a > Integer(b)); } bool operator == (BigInt a, int b) { return (a == Integer(b)); } bool operator >= (BigInt a, int b) { return (a >= Integer(b)); } bool operator <= (BigInt a, int b) { return (a <= Integer(b)); } BigInt max(BigInt a, BigInt b) { if (a > b) return a; return b; } BigInt min(BigInt a, BigInt b) { if (a < b) return a; return b; } BigInt operator + (BigInt a, BigInt b) { Set(a); Set(b); BigInt ans; int carry = 0; FOR(i,0,max(a.size(), b.size())-1) { if (i < a.size()) carry += a[i]; if (i < b.size()) carry += b[i]; ans.pb(carry%base); carry /= base; } if (carry) ans.pb(carry); Set(ans); return ans; } BigInt operator + (BigInt a, int b) { return a + Integer(b); } BigInt operator ++ (BigInt &a) { // ++a a = a + 1; return a; } void operator += (BigInt &a, BigInt b) { a = a + b; } void operator += (BigInt &a, int b) { a = a + b; } BigInt operator - (BigInt a, BigInt b) { Set(a); Set(b); BigInt ans; int carry = 0; FOR(i,0,a.size()-1) { carry += a[i] - (i < b.size() ? b[i] : 0); if (carry < 0) ans.pb(carry+base), carry = -1; else ans.pb(carry), carry = 0; } Set(ans); return ans; } BigInt operator - (BigInt a, int b) { return a - Integer(b); } void operator -- (BigInt &a) { // --a a = a - 1; } void operator -= (BigInt &a, BigInt b) { a = a + b; } void operator -= (BigInt &a, int b) { a = a - b; } BigInt operator * (BigInt a, BigInt b) { Set(a); Set(b); BigInt ans; ans.assign(a.size()+b.size(), 0); FOR(i,0,a.size()-1) { ll carry = 0ll; for (int j=0;j<b.size() || carry > 0;j++) { ll s = ans[i+j] + carry + (ll)a[i]*(j<b.size()?(ll)b[j]:0ll); ans[i+j] = s%base; carry = s/base; } } Set(ans); return ans; } BigInt operator * (BigInt a, int b) { return a * Integer(b); } void operator *= (BigInt &a, BigInt b) { a = a * b; } void operator *= (BigInt &a, int b) { a = a * b; } BigInt operator / (BigInt a, BigInt b) { Set(a); Set(b); if (b == Integer(0)) return Integer("-1"); BigInt ans, cur; FORD(i,a.size()-1,0) { cur.insert(cur.begin(), a[i]); int x = 0, L = 0, R = base; while (L <= R) { int mid = (L+R)>>1; if (b*Integer(mid) > cur) { x = mid; R = mid-1; } else L = mid+1; } cur = cur - Integer(x-1)*b; ans.insert(ans.begin(),x-1); } Set(ans); return ans; } BigInt operator / (BigInt a, int b) { Set(a); BigInt ans; ll cur = 0ll; FORD(i,a.size()-1,0) { cur = (cur*(ll)base + (ll)a[i]); ans.insert(ans.begin(),cur/b); cur %= b; } Set(ans); return ans; } void operator /= (BigInt &a, BigInt b) { a = a / b; } void operator /= (BigInt &a, int b) { a = a / b; } BigInt operator % (BigInt a, BigInt b) { Set(a); Set(b); if (b == Integer(0)) return Integer("-1"); BigInt ans; FORD(i,a.size()-1,0) { ans.insert(ans.begin(), a[i]); int x = 0, L = 0, R = base; while (L <= R) { int mid = (L+R)>>1; if (b*Integer(mid) > ans) { x = mid; R = mid-1; } else L = mid+1; } ans = ans - Integer(x-1)*b; } Set(ans); return ans; } int operator % (BigInt a, int b) { Set(a); if (b == 0) return -1; int ans = 0; FORD(i,a.size()-1,0) ans = (ans*(base%b) + a[i]%b)%b; return ans; } void operator %= (BigInt &a, BigInt b) { a = a % b; } void operator %= (BigInt &a, int b) { a = a % Integer(b); } BigInt gcd(BigInt a, BigInt b) { Set(a); Set(b); while (b > Integer(0)) { BigInt r = a%b; a = b; b = r; } Set(a); return a; } BigInt lcm(BigInt a, BigInt b) { return (a*b/gcd(a,b)); } BigInt sqrt(BigInt a) { BigInt x0 = a, x1 = (a+1)/2; while (x1 < x0) { x0 = x1; x1 = (x1+a/x1)/2; } return x0; } BigInt pow(BigInt a, BigInt b) { if (b == Integer(0)) return Integer(1); BigInt tmp = pow(a, b/2); if (b%2 == 0) return tmp * tmp; return tmp * tmp * a; } BigInt pow(BigInt a, int b) { return pow(a,(Integer(b))); } int log(int n, BigInt a) { // log_n(a) Set(a); int ans = 0; while (a > Integer(1)) { ans++; a /= n; } return ans; } int n,is[N],a[N],mark[N]; BigInt q[N]; string s; int main() { scanf("%d",&n); assert(n <= 700); for (int i = 1 ; i <= n ; i++) { cin >> s; q[i] = Integer(s); } a[1] = 1; is[1] = 1; for (int i = 2 ; i <= n ; i++) { int cnt = 0,say = 0; BigInt diff = Integer("0"); diff += q[i] - q[i - 1] - 1; vector <pair <int,ii> > v; memset(mark,0,sizeof mark); for (int j = 1 ; j < i ; j++) v.pb(mp(a[j],mp(is[a[j]],j))); sort(v.begin(),v.end()); // d1(diff); for (int j = 0 ; j < len(v) ;j++) { if (diff == 0) break; diff -= v[j].sc.fi; say++; cnt += v[j].sc.fi; mark[v[j].sc.sc] = 1; } // printf("%d\n--------\n",i); // for (int j = 1 ; j < i ; j++) printf("%d ",mark[i]); // puts(""); for (int j = len(v) - 1; j >= 0 ; j--) { int x = v[j].sc.sc; if (mark[x] == 0) { is[a[x] + 1] = is[a[x]]; a[x]++; } } a[i] = say + 1; is[a[i]] = cnt + 1; // for (int i = 1 ; i <= n ; i++) printf("%d ",a[i]); // puts(""); } for (int i = 1 ; i <= n ; i++) { printf("%d ",a[i]); } }

Compilation message (stderr)

permutation.cpp:32:17: error: conflicting declaration 'typedef int64_t ll'
 typedef int64_t ll;
                 ^~
permutation.cpp:17:23: note: previous declaration as 'typedef long long int ll'
 typedef long long int ll;
                       ^~
permutation.cpp: In function 'BigInt Integer(std::__cxx11::string)':
permutation.cpp:69:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=0;i<s.size();i+=9) {
                  ~^~~~~~~~~
permutation.cpp: In function 'BigInt Integer(char*)':
permutation.cpp:46:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,l,r) for (int i=l;i<=r;i++)
permutation.cpp:80:9:
     FOR(i,0,strlen(c)-1) s = s + c[i];
         ~~~~~~~~~~~~~~~           
permutation.cpp:80:5: note: in expansion of macro 'FOR'
     FOR(i,0,strlen(c)-1) s = s + c[i];
     ^~~
permutation.cpp: In function 'BigInt operator+(BigInt, BigInt)':
permutation.cpp:46:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,l,r) for (int i=l;i<=r;i++)
permutation.cpp:175:9:
     FOR(i,0,max(a.size(), b.size())-1) {
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
permutation.cpp:175:5: note: in expansion of macro 'FOR'
     FOR(i,0,max(a.size(), b.size())-1) {
     ^~~
permutation.cpp:176:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if (i < a.size()) carry += a[i];
             ~~^~~~~~~~~~
permutation.cpp:177:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if (i < b.size()) carry += b[i];
             ~~^~~~~~~~~~
permutation.cpp: In function 'BigInt operator-(BigInt, BigInt)':
permutation.cpp:46:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,l,r) for (int i=l;i<=r;i++)
permutation.cpp:211:9:
     FOR(i,0,a.size()-1) {
         ~~~~~~~~~~~~~~            
permutation.cpp:211:5: note: in expansion of macro 'FOR'
     FOR(i,0,a.size()-1) {
     ^~~
permutation.cpp:212:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         carry += a[i] - (i < b.size() ? b[i] : 0);
                          ~~^~~~~~~~~~
permutation.cpp: In function 'BigInt operator*(BigInt, BigInt)':
permutation.cpp:46:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,l,r) for (int i=l;i<=r;i++)
permutation.cpp:244:9:
     FOR(i,0,a.size()-1) {
         ~~~~~~~~~~~~~~            
permutation.cpp:244:5: note: in expansion of macro 'FOR'
     FOR(i,0,a.size()-1) {
     ^~~
permutation.cpp:246:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j=0;j<b.size() || carry > 0;j++) {
                      ~^~~~~~~~~
permutation.cpp:247:50: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             ll s = ans[i+j] + carry + (ll)a[i]*(j<b.size()?(ll)b[j]:0ll);
                                                 ~^~~~~~~~~
permutation.cpp: In function 'BigInt operator/(BigInt, BigInt)':
permutation.cpp:273:45: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
     if (b == Integer(0)) return Integer("-1");
                                             ^
permutation.cpp: In function 'BigInt operator%(BigInt, BigInt)':
permutation.cpp:320:45: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
     if (b == Integer(0)) return Integer("-1");
                                             ^
permutation.cpp: In function 'int main()':
permutation.cpp:427:28: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
   BigInt diff = Integer("0");
                            ^
permutation.cpp:414:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
  ~~~~~^~~~~~~~~