Submission #900504

#TimeUsernameProblemLanguageResultExecution timeMemory
900504Trisanu_DasMagic Tree (CEOI19_magictree)C++17
14 / 100
141 ms128848 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define all(x) (x).begin(), (x).end() #define MP make_pair const int N = 100500; struct fenwick { vector<int> f; fenwick(int n) : f(n + 2) {} void add(int i, int x) { i++; while (i < f.size()) f[i] = max(f[i], x), i += -i & i; } int get(int i) { i++; int res = 0; while (i > 0) res = max(res, f[i]), i -= -i & i; return res; } }; vector<int> g[N]; vector<vector<ll>> dp; pair<int, int> fruit[N]; void dfs(int v) { dp[v][fruit[v].first] = fruit[v].second; for (int u : g[v]) dfs(u); for (int t = 1; t < dp[v].size(); t++) dp[v][t] += dp[v][t - 1]; for (int t = 1; t < dp[v].size(); t++) dp[v][t] = max(dp[v][t], dp[v][t - 1]); } int LIS(const vector<int> &a) { int n = a.size(); fenwick f(2e5); int res = 0; for (int i = 0; i < n; i++) { int _dp = f.get(a[i]) + 1; f.add(a[i], _dp); res = max(res, _dp); } return res; } void solve() { int n, m, k; cin >> n >> m >> k; ll sum = 0; bool sub3 = true; for (int i = 1; i < n; i++) { int p; cin >> p; --p; if (p != i - 1) sub3 = false; g[p].push_back(i); } map<int, int> mp; vector<int> a(n); for (int i = 0; i < m; i++) { int v, d, w; cin >> v >> d >> w; --v; mp[d]; fruit[v] = MP(d, w); sum += w; a[v] = d; if (w != 1) sub3 = false; } if (sub3) { vector<int> b; for (int x : a) if (x != 0) b.push_back(x); reverse(all(b)); cout << LIS(b) << endl; return; } mp[0]; k = 0; for (auto &now : mp) now.second = ++k; for (int i = 0; i < n; i++) fruit[i].first = mp[fruit[i].first]; if (k > 1000) { cout << sum << '\n'; return; } dp.assign(n, vector<ll>(k + 1, 0)); dfs(0); cout << dp[0].back() << endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }

Compilation message (stderr)

magictree.cpp: In member function 'void fenwick::add(int, int)':
magictree.cpp:13:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   13 |         while (i < f.size()) f[i] = max(f[i], x), i += -i & i;
      |                ~~^~~~~~~~~~
magictree.cpp: In function 'void dfs(int)':
magictree.cpp:30:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |     for (int t = 1; t < dp[v].size(); t++) dp[v][t] += dp[v][t - 1];
      |                     ~~^~~~~~~~~~~~~~
magictree.cpp:31:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   31 |     for (int t = 1; t < dp[v].size(); t++) dp[v][t] = max(dp[v][t], dp[v][t - 1]);
      |                     ~~^~~~~~~~~~~~~~
#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...