Submission #723679

#TimeUsernameProblemLanguageResultExecution timeMemory
723679dxz05Magic Tree (CEOI19_magictree)C++17
28 / 100
1727 ms791852 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.resize(n + 2); }; void add(int i, int x){ i++; while (i < (int)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++){ for (int u : g[v]){ dp[v][t] += dp[u][t]; } } 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 = (int) 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){ cout << LIS(a) << 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 << endl; return; } dp.assign(n, vector<ll>(k + 1, 0)); dfs(0); cout << dp[0].back() << endl; } int main() { ios_base::sync_with_stdio(false); #ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif solve(); return 0; }

Compilation message (stderr)

magictree.cpp: In function 'void dfs(int)':
magictree.cpp:45:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |     for (int t = 1; t < dp[v].size(); t++){
      |                     ~~^~~~~~~~~~~~~~
magictree.cpp:51:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |     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...