Submission #674646

#TimeUsernameProblemLanguageResultExecution timeMemory
674646tamthegodTeams (CEOI11_tea)C++17
50 / 100
2574 ms184076 KiB
// Make the best become better // No room for laziness #include<bits/stdc++.h> #define pb push_back #define fi first #define se second using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int maxN = 1e6 + 5; const int mod = 1e9 + 7; const ll oo = 1e9; int n, a[maxN], id[maxN]; int f[maxN], trace[maxN]; int dp[maxN]; pair<int, int> st[4 * maxN]; void ReadInput() { cin >> n; for(int i=1; i<=n; i++) cin >> a[i]; } void update(int id, int l, int r, int pos, pair<int, int> val) { if(l == r) { st[id] = val; return; } int mid = (l + r) / 2; if(pos <= mid) update(id * 2, l, mid, pos, val); else update(id * 2 + 1, mid + 1, r, pos, val); st[id] = max(st[id * 2], st[id * 2 + 1]); } pair<int, int> get(int id, int l, int r, int u, int v) { if(l > v || r < u) return {-oo, -oo}; if(l >= u && r <= v) return st[id]; int mid = (l + r) / 2; return max(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v)); } bool chk(int val) { memset(st, -3, sizeof st); memset(dp, -3, sizeof dp); dp[0] = 0; for(int i=1; i<=n; i++) { update(1, 1, n, i, {dp[i - 1], i}); int t = id[i]; int l = max(1, i - val + 1), r = i - a[t] + 1; pair<int, int> tmp = get(1, 1, n, l, r); dp[i] = tmp.fi + 1; } //cout << dp[4];exit(0); return dp[n] == f[n]; } void Print(int val) { memset(st, -3, sizeof st); memset(f, -3, sizeof f); f[0] = 0; for(int i=1; i<=n; i++) { update(1, 1, n, i, {f[i - 1], i}); int t = id[i]; int l = max(1, i - val + 1), r = i - a[t] + 1; pair<int, int> tmp = get(1, 1, n, l, r); f[i] = tmp.fi + 1; trace[i] = tmp.se; } cout << f[n] << '\n'; int i = n; while(i) { cout << i - trace[i] + 1 << " "; for(int j=i; j>=trace[i]; j--) cout << id[j] << " "; i = trace[i] - 1; cout << '\n'; } } void Solve() { iota(id + 1, id + n + 1, 1); sort(id + 1, id + n + 1, [](int i, int j) { return a[i] < a[j]; }); memset(st, -3, sizeof st); memset(f, -3, sizeof f); f[0] = 0; for(int i=1; i<=n; i++) { update(1, 1, n, i, {f[i - 1], i}); int t = id[i]; int l = 1, r = i - a[t] + 1; pair<int, int> tmp = get(1, 1, n, l, r); f[i] = tmp.fi + 1; } int low = a[id[n]], high = a[id[n]] + 100, mid; while(low <= high) { mid = (low + high) / 2; if(chk(mid)) high = mid - 1; else low = mid + 1; } //cout << low;return; Print(low); } int32_t main() { //freopen("x.inp", "r", stdin); ios_base::sync_with_stdio(false); cin.tie(nullptr); ReadInput(); Solve(); }

Compilation message (stderr)

tea.cpp: In function 'bool chk(int)':
tea.cpp:47:29: warning: 'void* memset(void*, int, size_t)' writing to an object of type 'struct std::pair<int, int>' with no trivial copy-assignment [-Wclass-memaccess]
   47 |     memset(st, -3, sizeof st);
      |                             ^
In file included from /usr/include/c++/10/bits/stl_algobase.h:64,
                 from /usr/include/c++/10/bits/specfun.h:45,
                 from /usr/include/c++/10/cmath:1927,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:41,
                 from tea.cpp:3:
/usr/include/c++/10/bits/stl_pair.h:211:12: note: 'struct std::pair<int, int>' declared here
  211 |     struct pair
      |            ^~~~
tea.cpp: In function 'void Print(int)':
tea.cpp:63:29: warning: 'void* memset(void*, int, size_t)' writing to an object of type 'struct std::pair<int, int>' with no trivial copy-assignment [-Wclass-memaccess]
   63 |     memset(st, -3, sizeof st);
      |                             ^
In file included from /usr/include/c++/10/bits/stl_algobase.h:64,
                 from /usr/include/c++/10/bits/specfun.h:45,
                 from /usr/include/c++/10/cmath:1927,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:41,
                 from tea.cpp:3:
/usr/include/c++/10/bits/stl_pair.h:211:12: note: 'struct std::pair<int, int>' declared here
  211 |     struct pair
      |            ^~~~
tea.cpp: In function 'void Solve()':
tea.cpp:93:29: warning: 'void* memset(void*, int, size_t)' writing to an object of type 'struct std::pair<int, int>' with no trivial copy-assignment [-Wclass-memaccess]
   93 |     memset(st, -3, sizeof st);
      |                             ^
In file included from /usr/include/c++/10/bits/stl_algobase.h:64,
                 from /usr/include/c++/10/bits/specfun.h:45,
                 from /usr/include/c++/10/cmath:1927,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:41,
                 from tea.cpp:3:
/usr/include/c++/10/bits/stl_pair.h:211:12: note: 'struct std::pair<int, int>' declared here
  211 |     struct pair
      |            ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...