#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> ii;
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<ll> vll;
#define REP(a,b,c) for(int a=int(b); a<int(c); a++)
#define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
#define RE(a,b) REP(a,0,b)
#define RE1(a,b) REP(a,1,b+1)
#define FOR(a,b) for(auto& a : b)
#define pb push_back
#define all(a) a.begin(),a.end()
#define fi first
#define se second
const int INF = 1e9;
const int MX = 3000;
const int N = 1<<20;
const int MOD = 1e9+7;
int r, s;
char gr[MX][MX];
int dx[]={-1,0,1,0};
int dy[]={0,-1,0,1};
// grid
bool inside(int x, int y) {
return x>=0&&y>=0&&x<r&&y<s;
}
bool isOil(int x, int y) {
if(!inside(x,y)) return 0;
return gr[x][y] != '.';
}
// DSU
int ra[MX], p[MX], minx[MX], maxx[MX], sm[MX];
void builddsu() {
RE(x,r) RE(y,s) {
int i=x+y*r;
ra[i]=0, p[i]=i, minx[i]=y, maxx[i]=y, sm[i]=0;
if(gr[x][y] != '.') sm[i]=gr[x][y]-'0';
}
}
int getSet(int i) {return i==p[i] ? i : p[i]=getSet(p[i]);}
void unionSet(int i, int j) {
i = getSet(i); j = getSet(j);
if(i == j) return;
sm[i] = sm[j] = sm[i]+sm[j];
minx[i] = minx[j] = min(minx[i], minx[j]);
maxx[i] = maxx[j] = max(maxx[i], maxx[j]);
if(ra[i] > ra[j]) {
p[j]=i;
} else {
p[i]=j;
if(ra[i] == ra[j]) ra[j]++;
}
}
// daq dp
int cost[MX][MX];
int dp[MX][MX];
void daq(int x, int l, int r, int al, int ar) {
if(r < l) return;
int m=(l+r)/2;
int bsti=al,bstAns=0;
REP(i,al,ar+1) {
if(i+1 > m) continue;
int nAns = dp[i][x-1] + cost[i+1][m];
if(nAns > bstAns) {
bstAns = nAns;
bsti=i;
}
}
dp[m][x] = bstAns;
daq(x,l,m-1,al,bsti);
daq(x,m+1,r,bsti,ar);
}
int main() {
cin>>r>>s;
RE(i,r) RE(j,s) cin>>gr[i][j];
builddsu();
RE(x,r) RE(y,s) RE(d,4) {
int nx=x+dx[d];
int ny=y+dy[d];
if(!isOil(x,y) || !isOil(nx,ny)) continue;
unionSet(x+y*r, nx+ny*r);
}
RE(i,r*s) {
if(p[i] != i) continue;
if(!sm[i]) continue;
cost[minx[i] ][maxx[i] ] += sm[i];
cost[maxx[i]+1][maxx[i]+1] -= sm[i];
}
RE(i,s) RE(j,s) {
if(i)
cost[i][j] += cost[i-1][j];
if(j)
cost[i][j] += cost[i][j-1];
if(i && j)
cost[i][j] -= cost[i-1][j-1];
}
RE(i,s) {
dp[i][0] = 0;
RE(j,i+1) dp[i][0] = max(dp[i][0], cost[j][i]);
}
REP(i,1,s) {
daq(i,0,s-1,0,s-1);
}
RE(i,s) cout<<dp[s-1][i]<<endl;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
844 KB |
Output is correct |
2 |
Correct |
1 ms |
844 KB |
Output is correct |
3 |
Correct |
1 ms |
844 KB |
Output is correct |
4 |
Correct |
1 ms |
844 KB |
Output is correct |
5 |
Correct |
1 ms |
844 KB |
Output is correct |
6 |
Correct |
1 ms |
936 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
844 KB |
Output is correct |
2 |
Correct |
1 ms |
844 KB |
Output is correct |
3 |
Correct |
1 ms |
844 KB |
Output is correct |
4 |
Correct |
1 ms |
844 KB |
Output is correct |
5 |
Correct |
1 ms |
844 KB |
Output is correct |
6 |
Correct |
1 ms |
936 KB |
Output is correct |
7 |
Runtime error |
12 ms |
2380 KB |
Execution killed with signal 11 |
8 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
844 KB |
Output is correct |
2 |
Correct |
1 ms |
844 KB |
Output is correct |
3 |
Correct |
1 ms |
844 KB |
Output is correct |
4 |
Correct |
1 ms |
844 KB |
Output is correct |
5 |
Correct |
1 ms |
844 KB |
Output is correct |
6 |
Correct |
1 ms |
936 KB |
Output is correct |
7 |
Runtime error |
12 ms |
2380 KB |
Execution killed with signal 11 |
8 |
Halted |
0 ms |
0 KB |
- |