Description
Mr. Bender has a digital table of size n × n, each cell can be switched on or off. He wants the field to have at least c switched on squares. When this condition is fulfilled, Mr Bender will be happy.
We'll consider the table rows numbered from top to bottom from 1 to n, and the columns — numbered from left to right from 1 to n. Initially there is exactly one switched on cell with coordinates (x, y) (x is the row number, y is the column number), and all other cells are switched off. Then each second we switch on the cells that are off but have the side-adjacent cells that are on.
For a cell with coordinates (x, y) the side-adjacent cells are cells with coordinates (x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1).
In how many seconds will Mr. Bender get happy?
Input
The first line contains four space-separated integers n, x, y, c(1 ≤ n, c ≤ 109; 1 ≤ x, y ≤ n; c ≤ n2).
Output
In a single line print a single integer — the answer to the problem.
Sample Input
6 4 3 1
0
9 3 8 10
2
Hint
Initially the first test has one painted cell, so the answer is 0. In the second test all events will go as is shown on the figure. .
//这题就是先算总面积,再减去超出面积,再加上重叠面积。关键要注意细节。
#include<iostream>
using namespace std;
int main()
{
long long x,n,y,c;
cin>>n>>y>>x>>c;
long long i,xr,xl,yu,yd,d;
x--;y--;
long now=0;
for(i=1;now<c;i++)
{
now=i*i+(i-1)*(i-1);
if(now<c)
continue;
i--;
xr=x+i;
xl=x-i;
yu=y-i;
yd=y+i;
if(xl<0) now-=xl*xl;
if(xr>n-1) now-=(xr-n+1)*(xr-n+1);
if(yu<0)
{
now-=yu*yu;
yu++;
d-=yu;
if(x+d>n-1)
now+=(x+d-n+2)*(x+d-n+1)/2;
if(x+yu<0)
now+=(x-d)*(x-d-1)/2;
}
if(yd>n-1)
{
now-=(yd-n+1)*(yd-n+1);
d=yd-n+1;
d--;
if(x+d>n-1) now+=(x+d-n+2)*(x+d-n+1)/2;
if(x-d<0) now+=(x-d)*(x-d-1)/2;
}
i++;
}
cout<<i-2<<endl;
}