-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsquares.cpp
60 lines (56 loc) · 1.25 KB
/
squares.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#define f(i,n) for(int i =0; i<n;i++)
bool grid[2000][2000];
int sol[2000][2000], row[2000][2000];
int n;
void solveDiag()
{
f(i,n){
f(j,n){
if(j==0)row[i][j]=grid[i][j];
else row[i][j]=row[i][j-1]+grid[i][j];
if(i==0)sol[i][j] = row[i][j];
else sol[i][j] = sol[i-1][j]+row[i][j];
}
}
}
int solve(int w){
int min=1<<30;
f(i,n-w+1)
f(j,n-w+1){
int val = ((i>0&&j>0)?sol[i-1][j-1]:0)+sol[i+w-1][j+w-1]
-((i>0)?sol[i-1][j+w-1]:0)-((j>0)?sol[i+w-1][j-1]:0);
min = min>val?val:min;
}
return min;
}
int bsSolve(int l){
int min = 1, max=n,works=-1;
while(max>=min){
int mid = (max+min)/2;
if(solve(mid)<=l){
min=mid+1;
works= mid;
}
else
max = mid-1;
}
return works;
}
int main(){
int tc, w,l, x,y;
scanf("%d",&tc);
f(i,tc){
scanf("%d%d%d",&n,&w,&l);
f(j,n)
f(k,n)
grid[j][k]=false;
f(j,w){
scanf("%d%d", &x,&y);
grid[x-1][y-1] = true;
}
solveDiag();
int solu = bsSolve(l);
printf("%d\n",solu*solu);
}
}