Submission #1075577

#TimeUsernameProblemLanguageResultExecution timeMemory
1075577Faisal_SaqibCatfish Farm (IOI22_fish)C++17
15 / 100
1042 ms199976 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define vll vector<ll> #define all(x) begin(x),end(x) const int N=1e5+10; map<ll,ll> pre[N]; map<ll,ll> dp[N][3]; vll possible[N]; vector<pair<ll,ll>> values[N]; ll solve(ll&n,ll&m,vll&x,vll&y,vll&w) { ll ans=0; for(int j=0;j<m;j++) { values[x[j]].push_back({y[j]+1,w[j]}); possible[x[j]].push_back(y[j]+1),possible[x[j]+1].push_back(y[j]+1); if(x[j]>0) possible[x[j]-1].push_back(y[j]+1); } for(int i=0;i<=n;i++) { possible[i].push_back(0); sort(begin(possible[i]),end(possible[i])); sort(begin(values[i]),end(values[i])); ll sm=0; int pp=0; for(auto&j:possible[i]) { while(pp<values[i].size() and values[i][pp].first<=j) { sm+=values[i][pp].second; pp++; } pre[i][j]=sm; } } // for(int i=0;i<n;i++) // for(int j=0;j<=n;j++) // for(int k=0;k<2;k++) // dp[i][j][k]=0; for(auto&h:possible[0]) { dp[0][0][h]=0; dp[0][1][h]=0; } for(int i=1;i<n;i++) { // ll sum=0; ll mx1=-2e18; ll mx2=-2e18; ll mx11=0,mx22=0; for(auto&ip:dp[i-1][0]) { int hp=ip.first; mx11=max(mx11,ip.second); mx1=max(mx1,ip.second-pre[i-1][hp]); } for(auto&ip:dp[i-1][1]) { int hp=ip.first; mx22=max(mx22,ip.second); mx2=max(mx2,ip.second+pre[i][hp]); } for(auto&h:possible[i]) { dp[i][0][h]=max(dp[i][0][h],mx1+pre[i-1][h]); dp[i][1][h]=max(dp[i][1][h],mx1+pre[i-1][h]); dp[i][1][h]=max(dp[i][1][h],mx2-pre[i][h]); dp[i][0][h]=max(dp[i][0][h],mx11); dp[i][0][h]=max(dp[i][0][h],mx22); dp[i][1][h]=max(dp[i][1][h],mx11); dp[i][1][h]=max(dp[i][1][h],mx22); // sum+=val[i-1][h]; // ll aux=0; // for(int nh=h+1;nh<=n;nh++) // { // // aux+=val[i][nh]; // dp[i][h][0]=max(dp[i][h][0],dp[i-1][nh][0]); // dp[i][h][0]=max(dp[i][h][0],dp[i-1][nh][1]); // dp[i][h][1]=max(dp[i][h][1],dp[i-1][nh][0]); // dp[i][h][1]=max(dp[i][h][1],dp[i-1][nh][1]+pre[i][nh]-pre[i][h]); // } // // ll og=sum; // for(int nh=0;nh<=h;nh++) // { // // sum-=val[i-1][nh]; // dp[i][h][0]=max(dp[i][h][0],dp[i-1][nh][0]+pre[i-1][h]-pre[i-1][nh]); // dp[i][h][0]=max(dp[i][h][0],dp[i-1][nh][1]); // dp[i][h][1]=max(dp[i][h][1],dp[i-1][nh][0]+pre[i-1][j]-pre[i-1][nh]); // dp[i][h][1]=max(dp[i][h][1],dp[i-1][nh][1]); // } // sum=og; } } for(int i=0;i<n;i++) { for(auto&ip:dp[i][0]) { // cout<<"AT "<<ip.first<<' '<<i<<' '<<ip.second<<endl; ans=max(ans,ip.second); } for(auto&ip:dp[i][1]) { // cout<<"AT1 "<<ip.first<<' '<<i<<' '<<ip.second<<endl; ans=max(ans,ip.second); } } return ans; } ll subtask2(ll&n,ll&m,vll&x,vll&y,vll&w) { ll ans=0; ll val[2][n]={0}; for(int i=0;i<2;i++) { for(int j=0;j<n;j++) { val[i][j]=0; } } ll sum1=0,sum0=0; for(int j=0;j<m;j++) { val[x[j]][y[j]]+=w[j]; if(x[j]==1) { sum1+=w[j]; } else { sum0+=w[j]; } } ans=max(sum0,sum1); ll taken=0; ll cur=0; for(int j=0;j<n;j++) { cur+=val[0][j]; taken+=val[1][j]; ans=max(ans,cur); if(n>2) ans=max(ans,cur+sum1-taken); } return ans; } ll subtask3(ll&n,ll&m,vll&x,vll&y,vll&w) { ll ans=0; ll val[n+1]; for(int i=0;i<n;i++)val[i]=0; for(int j=0;j<m;j++)val[x[j]]+=w[j]; ll dp[n+1][3][3]; for(int i=0;i<n;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) dp[i][j][k]=0; for(int i=1;i<n;i++) { // wall not at i dp[i][0][0]=max(max(dp[i-1][0][0],dp[i-1][0][1]),dp[i-1][1][0]); dp[i][0][1]=max(max(dp[i-1][0][0],dp[i-1][0][1]),dp[i-1][1][0]+val[i]); dp[i][1][0]=max(max(dp[i-1][0][1],dp[i-1][0][0]+val[i-1]),dp[i-1][1][0]); } for(int i=0;i<n;i++) { ans=max({ans,dp[i][0][0],dp[i][0][1],dp[i][1][0],dp[i][1][1]}); } return ans; } long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y,std::vector<int> W) { ll n=N,m=M,ans=0; vector<ll> x(all(X)),y(all(Y)),w(all(W)); ll mx_x=*max_element(all(x)); // if(n<=3000) return solve(n,m,x,y,w); if(mx_x<=1) return subtask2(n,m,x,y,w); return subtask3(n,m,x,y,w); }

Compilation message (stderr)

fish.cpp: In function 'long long int solve(long long int&, long long int&, std::vector<long long int>&, std::vector<long long int>&, std::vector<long long int>&)':
fish.cpp:30:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |             while(pp<values[i].size() and values[i][pp].first<=j)
      |                   ~~^~~~~~~~~~~~~~~~~
fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:181:16: warning: unused variable 'ans' [-Wunused-variable]
  181 |     ll n=N,m=M,ans=0;
      |                ^~~
#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...