Submission #800624

#TimeUsernameProblemLanguageResultExecution timeMemory
800624Ronin13Catfish Farm (IOI22_fish)C++17
100 / 100
670 ms158020 KiB
#include "fish.h"
#include <bits/stdc++.h>
#include <vector>
#define ll long long 
#define ull unsigned ll
#define f first
#define s second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pb push_back
#define epb emplace_back
using namespace std;

map <pii, ll> mp;
const int nmax = 300001;

vector <vector <int> > ff(nmax);
vector <vector <int> > pos(nmax);
vector <vector <ll> > smx(nmax), pmx(nmax);
vector <vector <ll> > pref(nmax);
long long max_weights(int n, int m, vector<int> x, vector<int> y,vector<int> w) {
  
  for(int i = 0; i < m; i++){
    x[i]++;
    y[i]++;
    mp[{x[i], y[i]}] = w[i];
    ff[x[i]].pb(y[i]); 
  }
  for(int i= 1; i <= n; i++){
      for(int j : ff[i - 1]) pos[i].pb(j);
      for(int j : ff[i + 1]) pos[i].pb(j);
      for(int j : ff[i]) pos[i].pb(j);
      pos[i].pb(-1);pos[i].pb(n + 1);
      sort(pos[i].begin(), pos[i].end());
      pos[i].erase(unique(pos[i].begin(), pos[i].end()), pos[i].end());
      pref[i].resize(pos[i].size());
      pref[i][0] = mp[{i, pos[i][0]}];
      for(int j = 1; j < pref[i].size(); ++j){
          pref[i][j] = pref[i][j - 1] + mp[{i, pos[i][j]}];
      }
  }
  ll p;
  ll u;
  for(int i = 1; i <= n; i++){
      vector <ll> dp, DP;
      dp.resize(pos[i].size());
      DP.resize(pos[i].size());
      smx[i].resize(pos[i].size());
      pmx[i].resize(pos[i].size());
      if(i == 1){
        fill(dp.begin(), dp.end(), 0);
        fill(DP.begin(), DP.end(), 0);
        p = dp[0];
        u = DP.back();
      }  
      else{
          for(int j = 0; j < pos[i].size(); j++){
              int val = pos[i][j];
              int u = lower_bound(pos[i - 1].begin(), pos[i - 1].end(), val) - pos[i - 1].begin();
             // cout << u << ' ';   
              dp[j] = smx[i - 1][u] - pref[i][j];
              u = upper_bound(pos[i - 1].begin(), pos[i - 1].end(), val) - pos[i - 1].begin() -1;
              
              DP[j] = pmx[i - 1][u] + pref[i - 1][u];
          }
         // DP[0] = max(DP[0], pmx[i - 1].back());
          dp.back() = max(dp.back(), DP.back());
          DP[0] = max({DP[0], p, u});
          p = dp[0];
          u= DP.back();
      }
      if(i == n)
        return max(dp[0], DP.back());
      int o = upper_bound(pos[i + 1].begin(), pos[i + 1].end(), pos[i].back()) - 
              pos[i + 1].begin() - 1;
      smx[i].back() = dp.back() + pref[i + 1][o];
      for(int j = pos[i].size() - 2; j >= 0; j--){
        int val = pos[i][j];
        int o = upper_bound(pos[i + 1].begin(), pos[i + 1].end(), val) - pos[i + 1].begin() - 1;
        smx[i][j] = max(smx[i][j + 1], dp[j] + pref[i + 1][o]);
      }
      pmx[i][0] = DP[0]- pref[i][0];
      for(int j = 1; j < pos[i].size(); j++){
          pmx[i][j] = max(pmx[i][j - 1], DP[j] - pref[i][j]);
      }
      
  }

  return 0;
}

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:38:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |       for(int j = 1; j < pref[i].size(); ++j){
      |                      ~~^~~~~~~~~~~~~~~~
fish.cpp:57:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |           for(int j = 0; j < pos[i].size(); j++){
      |                          ~~^~~~~~~~~~~~~~~
fish.cpp:83:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |       for(int j = 1; j < pos[i].size(); j++){
      |                      ~~^~~~~~~~~~~~~~~
#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...