제출 #1238790

#제출 시각아이디문제언어결과실행 시간메모리
1238790Zbyszek99메기 농장 (IOI22_fish)C++20
0 / 100
149 ms54088 KiB
#include "fish.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define ll long long #define ld long double #define ull unsigned long long #define ff first #define ss second #define pii pair<int,int> #define pll pair<long long, long long> #define vi vector<int> #define vl vector<long long> #define pb push_back #define rep(i, b) for(int i = 0; i < (b); ++i) #define rep2(i,a,b) for(int i = a; i <= (b); ++i) #define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c) #define count_bits(x) __builtin_popcountll((x)) #define all(x) (x).begin(),(x).end() #define siz(x) (int)(x).size() #define forall(it,x) for(auto& it:(x)) using namespace __gnu_pbds; using namespace std; typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set; //mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());} //ll los(ll a, ll b) {return a + (mt() % (b-a+1));} const int INF = 1e9+50; const ll INF_L = 1e18+40; const ll MOD = 1e9+7; vector<pll> dps[100003][2]; vector<pll> vals[100003]; ll max_weights(int n, int m, vi X, vi Y, vi W) { rep(i,m) X[i] += 2; rep(i,m) { vals[X[i]].pb({Y[i]+1,W[i]}); } rep(i,n+2) sort(all(vals[i])); dps[0][0] = {{0,0}}; dps[1][0] = {{0,0}}; dps[0][1] = {{0,0}}; dps[1][1] = {{0,0}}; rep2(i,2,n+1) { vi dps_sort; forall(it,vals[i-1]) dps_sort.pb(it.ff); forall(it,vals[i+1]) dps_sort.pb(it.ff); sort(all(dps_sort)); vi d = {0}; vi right_add = {0}; dps[i][0].pb({0,0}); dps[i][1].pb({0,0}); int pop = -1; forall(it,dps_sort) { if(it != pop) { d.pb(it); right_add.pb(0); dps[i][0].pb({it,0}); dps[i][1].pb({it,0}); } pop = it; } // right add int cur_right = 0; ll right_sum = 0; rep(j,siz(d)) { while(cur_right < siz(vals[i+1]) && vals[i+1][cur_right].ff <= d[j]) { right_sum += vals[i+1][cur_right].ss; cur_right++; } right_add[j] = right_sum; } // smaller space ll max_dp = 0; forall(it,dps[i-2][0]) max_dp = max(max_dp,it.ss); forall(it,dps[i-2][1]) max_dp = max(max_dp,it.ss); rep(j,siz(d)) { dps[i][0][j].ss = max_dp; dps[i][1][j].ss = max_dp; } // bigger space max_dp = 0; ll left_sum = 0; int cur_left_val = 0; int cur_left_dp = 0; rep(j,siz(d)) { while(cur_left_dp < siz(dps[i-2][0]) && dps[i-2][0][cur_left_dp].ff <= d[j]) { while(cur_left_val < siz(vals[i-1]) && vals[i-1][cur_left_val].ff <= dps[i-2][0][cur_left_dp].ff) { left_sum += vals[i-1][cur_left_val].ss; cur_left_val++; } max_dp = max(max_dp,dps[i-2][0][cur_left_dp].ss-left_sum); max_dp = max(max_dp,dps[i-2][1][cur_left_dp].ss-left_sum); cur_left_dp++; } while(cur_left_val < siz(vals[i-1]) && vals[i-1][cur_left_val].ff <= d[j]) { left_sum += vals[i-1][cur_left_val].ss; cur_left_val++; } rep(d,2) dps[i][d][j].ss = max(dps[i][d][j].ss,max_dp + left_sum); } // smaller max_dp = 0; forall(it,dps[i-1][0]) max_dp = max(max_dp,it.ss); ll my_sum = 0; forall(it,vals[i]) my_sum += it.ss; int cur_my_vals = siz(vals[i])-1; for(int j = siz(d)-1; j >= 0; j--) { while(cur_my_vals >= 0 && vals[i][cur_my_vals].ff > d[j]) { my_sum -= vals[i][cur_my_vals].ss; cur_my_vals--; } dps[i][0][j].ss = max(dps[i][0][j].ss,max_dp-my_sum); } // bigger max_dp = 0; left_sum = 0; my_sum = 0; cur_my_vals = 0; cur_left_val = 0; cur_left_dp = 0; rep(j,siz(d)) { while(cur_left_dp < siz(dps[i-1][0]) && dps[i-1][0][cur_left_dp].ff <= d[j]) { while(cur_my_vals < siz(vals[i]) && vals[i][cur_my_vals].ff <= dps[i-1][0][cur_left_dp].ff) { my_sum += vals[i][cur_my_vals].ss; cur_my_vals++; } while(cur_left_val < siz(vals[i-1]) && vals[i-1][cur_left_val].ff <= dps[i-1][0][cur_left_dp].ff) { left_sum += vals[i-1][cur_left_val].ss; cur_left_val++; } max_dp = max(max_dp,dps[i-1][1][cur_left_dp].ss-my_sum-left_sum); cur_left_dp++; } while(cur_my_vals < siz(vals[i]) && vals[i][cur_my_vals].ff <= dps[i-1][0][cur_left_dp].ff) { my_sum += vals[i][cur_my_vals].ss; cur_my_vals++; } while(cur_left_val < siz(vals[i-1]) && vals[i-1][cur_left_val].ff <= dps[i-1][0][cur_left_dp].ff) { left_sum += vals[i-1][cur_left_val].ss; cur_left_val++; } dps[i][1][j].ss = max(dps[i][1][j].ss,max_dp+left_sum); } } ll ans = 0; forall(it,dps[n+1][0]) ans = max(ans,it.ss); forall(it,dps[n+1][1]) ans = max(ans,it.ss); return ans; }
#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...