Submission #791029

#TimeUsernameProblemLanguageResultExecution timeMemory
791029penguinmanCatfish Farm (IOI22_fish)C++17
100 / 100
452 ms71252 KiB
#include "fish.h" #include <bits/stdc++.h> using std::vector; using std::string; using std::cin; using std::cout; using ll = long long; using vi = vector<ll>; using vii = vector<vi>; using pii = std::pair<ll,ll>; #define ln "\n" #define rep(i,j,k) for(ll i=ll(j); i<ll(k); i++) #define REP(i,j,k) for(ll i=ll(j); i<=ll(k); i++) #define per(i,j,k) for(ll i=ll(j); i>=ll(k); i--) #define all(a) a.begin(), a.end() #define mp std::make_pair #define pb emplace_back constexpr ll inf = (1ll<<60); long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y, std::vector<int> W) { // task 6 rep(i,0,M) X[i]++, Y[i]++; // data1 : その行 // data2 : 隣接 vector<vector<pii>> data1(N+2), data2(N+2); rep(i,0,M){ data1[X[i]].pb(mp(Y[i],W[i])); if(X[i]-1) data2[X[i]-1].pb(mp(Y[i],W[i])); if(X[i]+1 <= N) data2[X[i]+1].pb(mp(Y[i],W[i])); } vii sum(N+2); rep(i,0,N+2){ data1[i].pb(mp(0,0)); data2[i].pb(mp(0,0)); sort(all(data1[i])); sort(all(data2[i])); sum[i].resize(data1[i].size()); rep(j,1,data1[i].size()) sum[i][j] = sum[i][j-1]+data1[i][j].second; } auto id = [&](ll x, ll height){ ll idx = std::upper_bound(all(data1[x]), mp(height, inf))-data1[x].begin(); idx--; return idx; }; auto calc = [&](ll x, ll height){ ll idx = std::upper_bound(all(data1[x]), mp(height, inf))-data1[x].begin(); idx--; return sum[x][idx]; }; vii up(N+2), down(N+2); up[0].resize(1); down[0].resize(1); up[0][0] = down[0][0] = 0; rep(i,1,N+2){ up[i].resize(data2[i].size(),-inf); down[i].resize(data2[i].size(),-inf); { vi max(data2[i-1].size()); rep(j,0,data2[i-1].size()){ max[j] = up[i-1][j]-calc(i-1, data2[i-1][j].first); if(j) max[j] = std::max(max[j], max[j-1]); } rep(j,0,data2[i].size()){ ll idx = upper_bound(all(data2[i-1]), data2[i][j])-data2[i-1].begin(); if(idx) up[i][j] = std::max(up[i][j], max[idx-1]+calc(i-1, data2[i][j].first)); } } { vi max(data2[i-1].size()); per(j,data2[i-1].size()-1,0){ max[j] = down[i-1][j]+calc(i, data2[i-1][j].first); if(j+1 < data2[i-1].size()) max[j] = std::max(max[j], max[j+1]); } rep(j,0,data2[i].size()){ ll idx = lower_bound(all(data2[i-1]), data2[i][j])-data2[i-1].begin(); if(idx < data2[i-1].size()) down[i][j] = std::max(down[i][j], max[idx]-calc(i, data2[i][j].first)); } } if(i-2 >= 0){ vi max(data2[i-2].size()); per(j,data2[i-2].size()-1,0){ max[j] = down[i-2][j]+calc(i-1, data2[i-2][j].first); if(j+1 < data2[i-2].size()) max[j] = std::max(max[j], max[j+1]); } rep(j,0,data2[i].size()){ ll idx = lower_bound(all(data2[i-2]), data2[i][j])-data2[i-2].begin(); if(idx < data2[i-2].size()) up[i][j] = std::max(up[i][j], max[idx]); } } if(i-2 >= 0){ vi max(data2[i-2].size()); rep(j,0,data2[i-2].size()){ max[j] = down[i-2][j]; if(j) max[j] = std::max(max[j], max[j-1]); } rep(j,0,data2[i].size()){ ll idx = upper_bound(all(data2[i-2]), data2[i][j])-data2[i-2].begin(); if(idx) up[i][j] = std::max(up[i][j], max[idx-1]+calc(i-1, data2[i][j].first)); } } if(i-3 >= 0){ ll max = 0; rep(k,0,data2[i-3].size()){ max = std::max(max, down[i-3][k]+calc(i-2, data2[i-3][k].first)); } rep(j,0,data2[i].size()){ up[i][j] = std::max(up[i][j], max+calc(i-1,data2[i][j].first)); } } rep(j,0,data2[i].size()) down[i][j] = std::max(down[i][j], up[i][j]); } ll ans = std::max(up[N+1][0], down[N+1][0]); return ans; }

Compilation message (stderr)

fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:74:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |         if(j+1 < data2[i-1].size()) max[j] = std::max(max[j], max[j+1]);
      |            ~~~~^~~~~~~~~~~~~~~~~~~
fish.cpp:78:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |         if(idx < data2[i-1].size()) down[i][j] = std::max(down[i][j], max[idx]-calc(i, data2[i][j].first));
      |            ~~~~^~~~~~~~~~~~~~~~~~~
fish.cpp:85:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   85 |         if(j+1 < data2[i-2].size()) max[j] = std::max(max[j], max[j+1]);
      |            ~~~~^~~~~~~~~~~~~~~~~~~
fish.cpp:89:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |         if(idx < data2[i-2].size()) up[i][j] = std::max(up[i][j], max[idx]);
      |            ~~~~^~~~~~~~~~~~~~~~~~~
fish.cpp:42:8: warning: variable 'id' set but not used [-Wunused-but-set-variable]
   42 |   auto id = [&](ll x, ll height){
      |        ^~
#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...