Submission #1200220

#TimeUsernameProblemLanguageResultExecution timeMemory
1200220Muhammad_AneeqNafta (COI15_nafta)C++20
100 / 100
365 ms96968 KiB
#include <iostream> #include <vector> #include <set> using namespace std; int const N=2e3+10; char a[N][N]={}; bool vis[N][N]={}; set<int>cur; int x[4]={1,-1,0,0},y[4]={0,0,1,-1}; int n,m; int ov[N][N]={}; int dp[N][N]={}; bool check(int i,int j) { if (min(i,j)<0||i>=n||j>=m||a[i][j]=='.'||vis[i][j]) return 0; return 1; } int sm=0; void dfs(int i,int j) { cur.insert(j+1); vis[i][j]=1; sm+=(a[i][j]-'0'); for (int k=0;k<4;k++) { if (check(i+x[k],j+y[k])) dfs(i+x[k],j+y[k]); } } void comp(vector<int>z) { int x=z.size(); for (auto i:z) ov[i][z[0]]+=sm; } int cost(int l,int r) { return ov[r][l+1]; } void divi(int st,int en,int k,int l,int r) { if (st>en) return; int opt=l; int mid=(st+en)/2; for (int j=l;j<=r && j<mid;j++) { if (dp[j][k-1]+cost(j,mid)>dp[opt][k-1]+cost(opt,mid)) opt=j; } dp[mid][k]=dp[opt][k-1]+cost(opt,mid); divi(st,mid-1,k,l,opt); divi(mid+1,en,k,opt,r); } inline void solve() { cin>>n>>m; for (int i=0;i<n;i++) for (int j=0;j<m;j++) cin>>a[i][j]; for (int i=0;i<n;i++) { for (int j=0;j<m;j++) { if (!vis[i][j]&&a[i][j]!='.') { sm=0; cur={}; dfs(i,j); vector<int>z={begin(cur),end(cur)}; comp(z); } } } for (int i=1;i<=m;i++) for (int j=i;j>0;j--) ov[i][j-1]+=ov[i][j]; for (int i=1;i<=m;i++) { divi(1,m,i,0,m); int ans=0; for (int j=1;j<=m;j++) ans=max(ans,dp[j][i]); cout<<ans<<endl; } } int main() { ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); int t=1; for (int i=1;i<=t;i++) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...