Submission #723915

#TimeUsernameProblemLanguageResultExecution timeMemory
723915sunnatMagic Tree (CEOI19_magictree)C++14
Compilation error
0 ms0 KiB
#include <algorithm> #include <iostream> #include <vector> #include <queue> #include <cmath> #include <map> #include <set> using namespace std; #define int long long struct node{ int mx; int left; int right; node(){ mx = 0; left = right = -1; } }; node free_node; int k; struct Dynamic_Segment_Tree{ set<pair<int, int> > t; Dynamic_Segment_Tree(){ t.emplace(0, 0); } void set(int id, int w){ auto elem = t.lower_bound(make_pair(id+1, 0)); elem --; w += elem->second; if(elem->first == id) t.erase(elem); t.emplace(id, w); elem = t.lower_bound(make_pair(id, w)); while(true){ auto nxt = elem; nxt ++; if(nxt == t.end() || nxt->second > elem->second) break; t.erase(nxt); } } void merge(Dynamic_Segment_Tree&d){ while(!d.t.empty()){ auto e = d.t.end(); e --; set(e->first, e->second); d.t.erase(e); } } void print(){ cout << "----" << endl; for(auto x:t) cout <<x.first << ' ' << x.second << endl; cout << "----" << endl; } }; Dynamic_Segment_Tree free_seg_tree; signed main(){ cin.tie(nullptr)->sync_with_stdio(false); int n, m; cin >> n >> m >> k; vector<int> seg_id(n, -1); vector<Dynamic_Segment_Tree> seg_tree; vector<vector<int> > g(n); vector<pair<int, int> > q(n, make_pair(-1, -1)); for(int i = 2, f; i <= n; i ++){ cin >> f; g[f-1].push_back(i-1); } for(int i = 0, v, d, w; i < m; i ++){ cin >> v >> d >> w; q[v-1] = make_pair(d, w); } for(int u = n-1; u >= 0; u --){ if(g[u].empty()){ if(q[u].first == -1) continue; seg_id[u] = seg_tree.size(); seg_tree.push_back(free_seg_tree); seg_tree[seg_id[u]].set(q[u].first, q[u].second); } else{ sort(g[u].begin(), g[u].end(), [&](int r, int l){ if(seg_id[r] == -1) return false; if(seg_id[l] == -1) return true; return seg_tree[seg_id[r]].t.size() > seg_tree[seg_id[l]].t.size(); }); if(seg_id[g[u][0]] == -1){ if(q[u].first != -1) { seg_id[u] = seg_tree.size(); seg_tree.push_back(free_seg_tree); seg_tree[seg_id[u]].set(q[u].first, q[u].second); } else continue; } else{ seg_id[u] = seg_id[g[u][0]]; for(int i = 1; i < g[u].size() && seg_id[g[u][i]] != -1; i ++) seg_tree[seg_id[u]].merge(seg_tree[seg_id[g[u][i]]]); if(q[u].first != -1) seg_tree[seg_id[u]].set(q[u].first, q[u].second); } } // cout << u + 1 << endl; // seg_tree[seg_id[u]].print(); } cout << seg_tree[seg_id[0]].t.rbegin()->second; return 0; }

Compilation message (stderr)

magictree.cpp:31:10: error: declaration of 'void Dynamic_Segment_Tree::set(long long int, long long int)' changes meaning of 'set' [-fpermissive]
   31 |     void set(int id, int w){
      |          ^~~
In file included from /usr/include/c++/10/set:61,
                 from magictree.cpp:7:
/usr/include/c++/10/bits/stl_set.h:94:11: note: 'set' declared here as 'class std::set<std::pair<long long int, long long int> >'
   94 |     class set
      |           ^~~
magictree.cpp: In function 'int main()':
magictree.cpp:103:34: 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]
  103 |                 for(int i = 1; i < g[u].size() && seg_id[g[u][i]] != -1; i ++)
      |                                ~~^~~~~~~~~~~~~