Submission #1298865

#TimeUsernameProblemLanguageResultExecution timeMemory
1298865khoile08Financial Report (JOI21_financial)C++20
100 / 100
449 ms24508 KiB
#include <bits/stdc++.h> using namespace std; #define FOR(i, a, b) for(int i = a; i <= b; i++) #define FOD(i, a, b) for(int i = a; i >= b; i--) #define fi first #define se second #define ll long long #define db double #define ii pair<int,int> #define pb push_back #define MASK(i) (1LL << i) #define sq(i) (1LL * (i) * (i)) #define task "task" const ll INF = 1e18; const int inf = 1e9; const int N = 3e5 + 4; int n, d; int a[N]; set<int> cur; struct Smt { int mx[4 * N]; void upd(int id, int l, int r, int pos, int d) { if(pos < l || pos > r) return; if(l == r) { mx[id] = d; return; } int mid = l + r >> 1; upd(id << 1, l, mid, pos, d); upd(id << 1 | 1, mid + 1, r, pos, d); mx[id] = max(mx[id << 1], mx[id << 1 | 1]); } int get(int id, int l, int r, int u, int v) { if(l > v || r < u) return -1; if(l >= u && r <= v) return mx[id]; int mid = l + r >> 1; return max(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v)); } } smt; struct Dsu { int root[N], sze[N], mn[N]; void init() { FOR(i, 1, n) { root[i] = i; sze[i] = 1; mn[i] = i; } } int anc(int u) { return root[u] == u ? u : root[u] = anc(root[u]); } bool join(int u, int v) { u = anc(u); v = anc(v); if(u == v) return false; if(sze[u] < sze[v]) swap(u, v); root[v] = u; sze[u] += sze[v]; mn[u] = min(mn[u], mn[v]); return true; } } dsu; signed main() { if(fopen(task".inp", "r")) { freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> d; FOR(i, 1, n) cin >> a[i]; vector<int> idx; FOR(i, 1, n) idx.pb(i); sort(idx.begin(), idx.end(), [&](int u, int v) { if(a[u] == a[v]) return u > v; return a[u] < a[v]; }); dsu.init(); for(int i : idx) { set<int>::iterator it = cur.lower_bound(i); if(it != cur.end() && abs(*it - i) <= d) dsu.join(i, *it); if(it != cur.begin()) { it--; if(abs(*it - i) <= d) dsu.join(i, *it); } int best = 1; int mn = dsu.mn[dsu.anc(i)]; if(mn < i) best = max(best, smt.get(1, 1, n, mn, i - 1) + 1); smt.upd(1, 1, n, i, best); cur.insert(i); } cout << smt.mx[1] << '\n'; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:76:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:77:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...