Skip to content

Commit d95a987

Browse files
authored
Merge pull request #592 from AlgorithmWithGod/khj20006
[20250802] BOJ / P4 / 푸앙이와 레벨업 / 권혁준
2 parents 9feee97 + 9ab1e32 commit d95a987

File tree

1 file changed

+174
-0
lines changed

1 file changed

+174
-0
lines changed
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
5+
class IOController {
6+
BufferedReader br;
7+
BufferedWriter bw;
8+
StringTokenizer st;
9+
10+
public IOController() {
11+
br = new BufferedReader(new InputStreamReader(System.in));
12+
bw = new BufferedWriter(new OutputStreamWriter(System.out));
13+
st = new StringTokenizer("");
14+
}
15+
16+
String nextLine() throws Exception {
17+
String line = br.readLine();
18+
st = new StringTokenizer(line);
19+
return line;
20+
}
21+
22+
String nextToken() throws Exception {
23+
while (!st.hasMoreTokens()) nextLine();
24+
return st.nextToken();
25+
}
26+
27+
int nextInt() throws Exception {
28+
return Integer.parseInt(nextToken());
29+
}
30+
31+
long nextLong() throws Exception {
32+
return Long.parseLong(nextToken());
33+
}
34+
35+
double nextDouble() throws Exception {
36+
return Double.parseDouble(nextToken());
37+
}
38+
39+
void close() throws Exception {
40+
bw.flush();
41+
bw.close();
42+
}
43+
44+
void write(String content) throws Exception {
45+
bw.write(content);
46+
}
47+
48+
}
49+
50+
public class Main {
51+
52+
static IOController io;
53+
54+
//
55+
56+
static int N;
57+
static long R;
58+
static int[][] a;
59+
60+
public static void main(String[] args) throws Exception {
61+
62+
io = new IOController();
63+
64+
init();
65+
solve();
66+
67+
io.close();
68+
69+
}
70+
71+
static void init() throws Exception {
72+
73+
N = io.nextInt();
74+
R = io.nextLong();
75+
a = new int[N][N];
76+
for(int i=0;i<N;i++) for(int j=0;j<N;j++) a[i][j] = io.nextInt();
77+
78+
}
79+
80+
static void solve() throws Exception {
81+
82+
// 불가능한 경우 판별
83+
{
84+
long max = 0;
85+
for(int i=0;i<N;i++) for(int j=0;j<N;j++) max = Math.max(max, a[i][j]);
86+
if(max*N*N < R) {
87+
io.write("-1");
88+
return;
89+
}
90+
}
91+
92+
int s = 1, e = N, m = (s+e)>>1;
93+
while(s<e) {
94+
95+
int K = m;
96+
int[][] row = new int[N][N];
97+
int[][] rowMax = new int[N][N];
98+
Deque<int[]>[] deques = new Deque[N];
99+
for(int i=0;i<N;i++) deques[i] = new ArrayDeque<>();
100+
101+
for(int i=0;i<N;i++) {
102+
Deque<int[]> deque = new ArrayDeque<>();
103+
for(int j=0;j<K-1;j++) {
104+
while(!deque.isEmpty() && deque.peekLast()[0] < a[i][j]) deque.pollLast();
105+
deque.offerLast(new int[]{a[i][j], j});
106+
}
107+
for(int j=0;j<N;j++) {
108+
if(j+K-1 < N) {
109+
while(!deque.isEmpty() && deque.peekLast()[0] < a[i][j+K-1]) deque.pollLast();
110+
deque.offerLast(new int[]{a[i][j+K-1], j+K-1});
111+
}
112+
while(!deque.isEmpty() && deque.peekFirst()[1] < j) deque.pollFirst();
113+
row[i][j] = deque.peekFirst()[0];
114+
115+
//
116+
117+
while(!deques[j].isEmpty() && deques[j].peekLast()[0] < row[i][j]) deques[j].pollLast();
118+
deques[j].offerLast(new int[]{row[i][j], i});
119+
while(!deques[j].isEmpty() && i - deques[j].peekFirst()[1] >= K) deques[j].pollFirst();
120+
if(i >= K-1) rowMax[i-K+1][j] = deques[j].peekFirst()[0];
121+
122+
}
123+
}
124+
for(int i=N-K+1;i<N;i++) for(int j=0;j<N;j++) {
125+
while(!deques[j].isEmpty() && deques[j].peekFirst()[1] < i) deques[j].pollFirst();
126+
rowMax[i][j] = deques[j].peekFirst()[0];
127+
}
128+
129+
int[][] col = new int[N][N];
130+
int[][] colMax = new int[N][N];
131+
deques = new Deque[N];
132+
for(int i=0;i<N;i++) deques[i] = new ArrayDeque<>();
133+
134+
for(int j=0;j<N;j++) {
135+
Deque<int[]> deque = new ArrayDeque<>();
136+
for(int i=0;i<K-1;i++) {
137+
while(!deque.isEmpty() && deque.peekLast()[0] < a[i][j]) deque.pollLast();
138+
deque.offerLast(new int[]{a[i][j], i});
139+
}
140+
for(int i=0;i<N;i++) {
141+
if(i+K-1 < N) {
142+
while(!deque.isEmpty() && deque.peekLast()[0] < a[i+K-1][j]) deque.pollLast();
143+
deque.offerLast(new int[]{a[i+K-1][j], i+K-1});
144+
}
145+
while(!deque.isEmpty() && deque.peekFirst()[1] < i) deque.pollFirst();
146+
col[i][j] = deque.peekFirst()[0];
147+
148+
//
149+
150+
while(!deques[i].isEmpty() && deques[i].peekLast()[0] < col[i][j]) deques[i].pollLast();
151+
deques[i].offerLast(new int[]{col[i][j], j});
152+
while(!deques[i].isEmpty() && j - deques[i].peekFirst()[1] >= K) deques[i].pollFirst();
153+
if(j >= K-1) colMax[i][j-K+1] = deques[i].peekFirst()[0];
154+
}
155+
}
156+
for(int i=0;i<N;i++) for(int j=N-K+1;j<N;j++) {
157+
while(!deques[i].isEmpty() && deques[i].peekFirst()[1] < j) deques[i].pollFirst();
158+
colMax[i][j] = deques[i].peekFirst()[0];
159+
}
160+
161+
long res = 0;
162+
for(int i=0;i<N;i++) for(int j=0;j<N;j++) res += Math.max(rowMax[i][j], colMax[i][j]);
163+
164+
if(res >= R) e = m;
165+
else s = m+1;
166+
m = (s+e)>>1;
167+
168+
}
169+
io.write(m + "\n");
170+
171+
}
172+
173+
}
174+
```

0 commit comments

Comments
 (0)