Submission #1189444

#TimeUsernameProblemLanguageResultExecution timeMemory
1189444mertbbmCatfish Farm (IOI22_fish)C++20
100 / 100
258 ms82444 KiB
#include "fish.h" #include <bits/stdc++.h> //#include "grader.cpp" using namespace std; #define int long long #define ld long double #define show(x,y) cout << y << " " << #x << endl; #define show2(x,y,i,j) cout << y << " " << #x << " " << j << " " << #i << endl; #define show3(x,y,i,j,p,q) cout << y << " " << #x << " " << j << " " << #i << " " << q << " " << #p << endl; #define show4(x,y) for(auto it:y) cout << it << " "; cout << #x << endl; typedef pair<int,int>pii; typedef pair<int,pii>pi2; mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count()); long long max_weights(int32_t n, int32_t m, vector<int32_t>a, vector<int32_t>b, vector<int32_t>w){ vector<int>dis[n+5]; for(int x=0;x<m;x++){ a[x]++; b[x]++; dis[a[x]].push_back(b[x]-1); dis[a[x]].push_back(b[x]); dis[a[x]-1].push_back(b[x]); dis[a[x]+1].push_back(b[x]); } for(int x=0;x<=n;x++){ dis[x].push_back(0); dis[x].push_back(n); } vector<int>arr[n+5]; for(int x=0;x<=n;x++){ sort(dis[x].begin(),dis[x].end()); dis[x].resize(unique(dis[x].begin(),dis[x].end())-dis[x].begin()); //show4(dis[x],dis[x]); arr[x]=vector<int>(dis[x].size()+5,0); } for(int x=0;x<m;x++){ int index=lower_bound(dis[a[x]].begin(),dis[a[x]].end(),b[x])-dis[a[x]].begin(); arr[a[x]][index]+=w[x]; } vector<int>dp[2][n+5]; dp[0][0]=vector<int>(dis[0].size()+5,-1e15); dp[1][0]=vector<int>(dis[0].size()+5,-1e15); dp[0][0][0]=0; for(int index=1;index<=n;index++){ dp[0][index]=vector<int>(dis[index].size()+5,-1e15); dp[1][index]=vector<int>(dis[index].size()+5,-1e15); //go up int add=-1e15; int add2=0; int ptr=0; int cur=0; for(auto h:dis[index]){ while(ptr<(int)dis[index-1].size()&&dis[index-1][ptr]<=h){ add=max(add+arr[index-1][ptr],dp[0][index-1][ptr]); add2+=arr[index-1][ptr]; ptr++; } dp[0][index][cur]=max(dp[0][index][cur],add); if(h==n){ dp[1][index][cur]=max(dp[0][index][cur],dp[1][index][cur]); if(index>2){ int target=lower_bound(dis[index-2].begin(),dis[index-2].end(),n)-dis[index-2].begin(); dp[1][index][cur]=max(dp[1][index][cur],add2+dp[0][index-2][target]); } } cur++; } //go down add=-1e15; ptr=dis[index-1].size()-1; for(int y=dis[index].size()-1;y>=0;y--){ int h=dis[index][y]; while(ptr>=0&&dis[index-1][ptr]>=h){ add=max(add,dp[1][index-1][ptr]); ptr--; } dp[1][index][y]=max(dp[1][index][y],add); add+=arr[index][y]; } dp[0][index][0]=max(dp[1][index-1][0],dp[0][index][0]); //show(index,index-1); //show4(dis[index],dis[index]); //show4(dp0,dp[0][index]); //show4(dp1,dp[1][index]); } int maxi=0; for(int x=0;x<=n;x++){ for(auto it:dp[0][x]) maxi=max(maxi,it); for(auto it:dp[1][x]) maxi=max(maxi,it); } return maxi; }
#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...