【题目链接】:http://codeforces.com/problemset/problem/255/D

【题意】



给你一个n*n的方框;

给你一个方块;(以下说的方块都是单位方块)

每一秒钟,可以沿着当前有方块的地方往4个方向扩展一个方块;

问你最少要多少秒钟,平面上会有c个方块;

【题解】



画几张图可以发现,图形都是类似一个十字架的几何图案;

设a[n]表示第n-1秒时有多少个方块;

则有a[n] = a[n-1]+n*4

(a[1]=1)

递推一下能求出

a[n] = 2∗n 2 −2∗n+1 

但是可能会有一部分超出了格子的边界;

需要减去;超过的部分;

先求出这个图案的最左和最上、下、右的坐标;

看它在这4个方向上超过了多少;

减掉那个阶梯一样的部分;

因为4个方向都减掉了;

可能会有重复减掉的部分;

需要再加上;

不难发现;

设上半部分超过的部分为t

则如果y+t-1>n则右边和上边会有重复减掉的

如果y-(t-1)<1则左边和上边会有重复减掉的部分;

是一个阶梯(公差为1的等差数列);

….

下面和左边、右边重复的部分类似.

显然有单调性;

二分一下时间就好;



【Number Of WA】



0



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("D:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0),cin.tie(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 310; LL n,x,y,c; LL sqr(LL x){ return x*x;} int main(){
//Open();
Close();//scanf,puts,printf not use
//init??????
cin >> n >> x >> y >> c;
LL L = 0,R = 1e5,ans = -1;
while (L <= R){
LL mid = (L+R)>>1;
//mid = 2;
LL temp = 2*sqr(mid+1)-2*(mid+1)+1;
if (temp<c){
L = mid + 1;
continue;
}
LL r = x + mid,l = x - mid,u = y + mid,d = y - mid;
if (r > n)
temp-=1LL*(r-n)*(r-n);
if (l < 1)
temp-=1LL*(1-l)*(1-l);
if (u > n){
temp-=sqr(u-n);
LL t = u-n;
t--;
if (x+t>n){
temp+=(x+t-n+1)*(x+t-n)/2;
}
if (x-t<1){
temp+=(1-x+t)*(1-x+t+1)/2;
}
}
if (d < 1){
temp-=sqr(1-d);
LL t = 1-d;
t--;
if(x+t>n){
temp+=(x+t-n+1)*(x+t-n)/2;
}
if(x-t<1){
temp+=(1-x+t)*(1-x+t+1)/2;
}
}
// cout << temp << endl;
//return 0;
//cout <<mid<<"->"<<temp<<endl;
//cout << endl;
if (temp>=c){
ans = mid;
R = mid-1;
}
else
L = mid+1;
}
cout << ans << endl;
return 0;
}

最新文章

  1. 教你一招:解决win10/win8.1系统在安装、卸载软件时出现2502、2503错误代码的问题
  2. ShellShock 攻击实验
  3. iOS中修改头部tabBarButton 默认按钮的颜色和默认字体颜色
  4. oracle 正则表达式
  5. Java生成BASE64编码
  6. 关于fill_parent,match_parent和wrap_content (转载)
  7. 【练习】使用接口回调和handler实现数据加载到listview
  8. BZOJ2721 [Violet 5]樱花
  9. KMP算法浅析
  10. Looksery Cup 2015 B. Looksery Party 暴力
  11. ListCtrl控件的使用
  12. Android Vibrator系统分析
  13. switchover和failover
  14. 【IPC进程间通信之四】数据复制消息WM_COPYDATA
  15. Spring ioc与aop的理解
  16. 安装PyCharm
  17. 2018-2019-1 20165205 ch02 课下作业
  18. 【python学习-5】面向对象的python
  19. 华为P10闪存门
  20. 【H.264/AVC视频编解码技术具体解释】十三、熵编码算法(4):H.264使用CAVLC解析宏块的残差数据

热门文章

  1. 使用multiprocessing模块操作进程
  2. Vim 学习指南
  3. docker images镜像无法删除
  4. [NOIP2012提高组]开车旅行
  5. GRUB 引导流程
  6. UVALive 2664 One-way traffic
  7. NYIST 1030 Yougth&#39;s Game[Ⅲ]
  8. MyEclipse2014高速配置Spring &amp;amp; Spring Testing, Spring AOP简单使用
  9. doT.js变量和数组混合读取方式
  10. iOS CoreData 介绍和使用(以及一些注意事项)