Submission #999406

#TimeUsernameProblemLanguageResultExecution timeMemory
999406snpmrnhlolConstellation 3 (JOI20_constellation3)C++17
35 / 100
1565 ms61268 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll N = 2e5; const ll G = 2*N; ll n,m; vector <ll> e[G]; ll v[N]; ll leftid[N],rightid[N]; ll leftside[N + 1],rightside[N + 1]; /// ll stk[N]; vector <ll> p; struct star{ ll x,y,c; }v2[N]; vector <ll> cand[G]; map<ll,pair<ll,ll>> f; vector <ll> polls; ll dp[G]; ll cnt = 0; void addedge(ll u,ll w){ e[u].push_back(w); } void dfs(ll node){ ll mx = 0; for(auto i:e[node]){ dfs(i); mx+=dp[i]; } for(auto i:cand[node]){ ///leftadd star s = v2[i]; ll candcost = s.c; for(ll j = s.x;j != n && v[j] < s.y;j = rightside[j]){ if(rightid[j] != -1){candcost+=dp[rightid[j]];}; } for(ll j = s.x;j != n && v[j] < s.y;j = leftside[j]){ if(leftid[j] != -1){candcost+=dp[leftid[j]];}; } mx = max(mx,candcost); } dp[node] = mx; } int main(){ cin>>n; p.resize(n); for(ll i = 0;i < n;i++){ cin>>v[i]; p[i] = i; leftid[i] = rightid[i] = -1; } sort(p.begin(),p.end(),[&](ll a,ll b){ if(v[a] == v[b])return a < b; return v[a] > v[b]; }); cin>>m; ll sum = 0; for(ll i = 0;i < m;i++){ cin>>v2[i].x>>v2[i].y>>v2[i].c; sum+=v2[i].c; v2[i].x--; } sort(v2,v2 + m,[&](star a,star b){ return a.y > b.y; }); f[0] = {n - 1,cnt++}; ll pt = 0; ll pt2 = 0; for(ll i = n;i >= 1;i--){ polls.clear(); while(pt2 < n && v[p[pt2]] >= i){ polls.push_back(p[pt2]); pt2++; } ll j = 0; while(j < polls.size()){ auto it = prev(f.upper_bound(polls[j])); ll k = j; while(k < polls.size() && polls[k] <= it->second.first){ k++; } ll l = it->first; ll r = it->second.first; ll id = it->second.second; f.erase(it); for(ll p = j;p <= k;p++){ ll lside = (p == j?l:polls[p - 1] + 1); ll rside = (p == k?r:polls[p] - 1); if(lside <= rside){ addedge(id,cnt); f[lside] = {rside,cnt}; if(p != k){ leftid[rside + 1] = cnt; } if(p != j){ rightid[lside - 1] = cnt; } cnt++; } } j = k; } while(pt < m && v2[pt].y >= i){ ll id = prev(f.upper_bound(v2[pt].x))->second.second; cand[id].push_back(pt); pt++; } } ll cnt2 = 0; for(ll i = 0;i < n;i++){ while(cnt2 > 0 && v[i] > v[stk[cnt2 - 1]]){ cnt2--; } leftside[i] = (cnt2 == 0?n:stk[cnt2 - 1]); stk[cnt2++] = i; } cnt2 = 0; for(ll i = n - 1;i >= 0;i--){ while(cnt2 > 0 && v[i] > v[stk[cnt2 - 1]]){ cnt2--; } rightside[i] = (cnt2 == 0?n:stk[cnt2 - 1]); stk[cnt2++] = i; } dfs(0); cout<<sum - dp[0]; return 0; }

Compilation message (stderr)

constellation3.cpp: In function 'int main()':
constellation3.cpp:77:17: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |         while(j < polls.size()){
      |               ~~^~~~~~~~~~~~~~
constellation3.cpp:80:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |             while(k < polls.size() && polls[k] <= it->second.first){
      |                   ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...