Submission #1050060

#TimeUsernameProblemLanguageResultExecution timeMemory
1050060hungeazyZoltan (COCI16_zoltan)C++17
140 / 140
83 ms23496 KiB
/* * @Author: hungeazy * @Date: 2024-08-09 13:41:17 * @Last Modified by: hungeazy * @Last Modified time: 2024-08-09 14:05:48 */ #include <bits/stdc++.h> // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") // #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt") using namespace std; #define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); #define int long long #define ull unsigned long long #define sz(x) x.size() #define sqr(x) (1LL * (x) * (x)) #define all(x) x.begin(), x.end() #define fill(f,x) memset(f,x,sizeof(f)) #define FOR(i,l,r) for(int i=l;i<=r;i++) #define FOD(i,r,l) for(int i=r;i>=l;i--) #define ii pair<int,int> #define iii pair<int,ii> #define di pair<ii,ii> #define vi vector<int> #define vii vector<ii> #define mii map<int,int> #define fi first #define se second #define pb push_back #define MOD 1000000007 #define __lcm(a,b) (1ll * ((a) / __gcd((a), (b))) * (b)) #define YES cout << "YES\n" #define NO cout << "NO\n" #define MASK(i) (1LL << (i)) #define c_bit(i) __builtin_popcountll(i) #define BIT(x,i) ((x) & MASK(i)) #define SET_ON(x,i) ((x) | MASK(i)) #define SET_OFF(x,i) ((x) & ~MASK(i)) #define oo 1e18 #define name "" #define endl '\n' #define time() cerr << endl << "-------------Time:" << 1000.0 * clock() / CLOCKS_PER_SEC << "ms."; template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; } template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; } const int N = (int)1e6+10; int a[N],n; namespace hungeazy { ii bit[N][2]; int cnt[N][2],f[N][2]; vi v; void update(int pos, int type, int val, int way) { int id = pos; while (id <= v.size()) { if (bit[id][type].fi < val) bit[id][type] = {val,way}; else if (bit[id][type].fi == val) (bit[id][type].se += way) %= MOD; id += (id&(-id)); } } ii get(int pos, int type) { int id = pos; ii ans = {0,1}; while (id) { if (ans.fi == bit[id][type].fi) (ans.se += bit[id][type].se) %= MOD; else if (ans.fi < bit[id][type].fi) ans = bit[id][type]; id -= (id&(-id)); } return ans; } void solve(void) { FOR(i,1,n) v.pb(a[i]); sort(all(v)); v.erase(unique(all(v)),v.end()); FOR(i,1,n) a[i] = lower_bound(all(v),a[i])-v.begin()+1; ii ans = {0,0}; FOD(i,n,1) { ii val = get(a[i]-1,0); int w = val.se; if (f[a[i]][0] < val.fi+1) { f[a[i]][0] = val.fi+1; cnt[a[i]][0] = w; update(a[i],0,f[a[i]][0],cnt[a[i]][0]); } else if (f[a[i]][0] == val.fi+1) { (cnt[a[i]][0] += w) %= MOD; update(a[i],0,f[a[i]][0],val.se); } val = get(v.size()-a[i],1); (w *= val.se) %= MOD; if (f[a[i]][1] < val.fi+1) { f[a[i]][1] = val.fi+1; cnt[a[i]][1] = val.se; update(v.size()-a[i]+1,1,f[a[i]][1],cnt[a[i]][1]); } else if (f[a[i]][1] == val.fi+1) { (cnt[a[i]][1] += val.se) %= MOD; update(v.size()-a[i]+1,1,f[a[i]][1],val.se); } if (f[a[i]][0]+f[a[i]][1]-1 > ans.fi) ans = {f[a[i]][0]+f[a[i]][1]-1,w}; else if (f[a[i]][0]+f[a[i]][1]-1 == ans.fi) (ans.se += w) %= MOD; } FOR(i,ans.fi+1,n) ans.se = 2*ans.se%MOD; cout << ans.fi << " " << ans.se; } } signed main() { fast; if (fopen(name".inp","r")) { freopen(name".inp","r",stdin); freopen(name".out","w",stdout); } cin >> n; FOR(i,1,n) cin >> a[i]; hungeazy::solve(); time(); return 0; } // ██░ ██ █ ██ ███▄ █ ▄████ //▓██░ ██▒ ██ ▓██▒ ██ ▀█ █ ██▒ ▀█▒ //▒██▀▀██░▓██ ▒██░▓██ ▀█ ██▒▒██░▄▄▄░ //░▓█ ░██ ▓▓█ ░██░▓██▒ ▐▌██▒░▓█ ██▓ //░▓█▒░██▓▒▒█████▓ ▒██░ ▓██░░▒▓███▀▒ // ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ░▒ ▒ // ▒ ░▒░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░ ░ ░ // ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░ // ░ ░ ░ ░ ░ ░

Compilation message (stderr)

zoltan.cpp: In function 'void hungeazy::update(long long int, long long int, long long int, long long int)':
zoltan.cpp:57:13: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |   while (id <= v.size())
      |          ~~~^~~~~~~~~~~
zoltan.cpp: In function 'int main()':
zoltan.cpp:127:13: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  127 |      freopen(name".inp","r",stdin);
      |      ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
zoltan.cpp:128:13: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  128 |      freopen(name".out","w",stdout);
      |      ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...