Codeforces Round #524 (Div. 2) D. Olya and magical square
D. Olya and magical square
题目链接:https://codeforces.com/contest/1080/problem/D
题意:
给出一个边长为2n的正方形,每次可以将其划分,要求划分出来从左下角到右上角沿着左边和上边的边走的路径的小正方形边长相等。现在有k个划分的机会,问是否能把k次机会用完(当边长为1时则不能划分了),如果可以,输出路径上的小正方形的边长长度。
题解:
这题看题解看了半天,最终应该说是搞懂了...
首先,划分思路是这样的,先划分一下成四块,然后每次划分都划分路径上面的正方形,等到路径正方形边长为1了,就随意划分其它的正方形了。
先判断可行性,我们知道,边长为2n的正方形最多只能划分(4n-1)/3次,由于k<=1018,所以当n>30时,必定k是可以用完的。最终,只要(4n-1)/3<k,就不能将划分次数用完。这里分n>30和n<=30是因为数据太大了,这样可以避免求4n时溢出。
当k可以用完时,我们再来看,我们就以上面说的划分思路来划分。
首先,划分一次变为四个正方形;
然后,对路径上面的正方形进行划分,每次全部划分需要消耗2i+1-1个划分次数。假设我们在第x次时,有k<2x+1-1,也就是说对路径上的正方形进行x-1轮划分过后,不能进一步划分,通过这里可以推出x-1<=n-1即x<=n。现在再来看右下角这个边长为2n-1的正方形,容易知道它最多划分(4n-1-1)/3次。
又2x+1-1<=2n+1-1,令(4n-1-1)/3>=2n+1-1,解得n>=5,也就是说当n>=5时,必定可以成功划分。(想一想为什么)
假定n>=3,那么会多出来5个边长为2n-2的小正方形,现在有5*(4n-2-1)/3+(4n-1-1)/3>=2n+1-1,可以解得n>=4,进一步推出n>=4时可以成功划分。
假定n=3,那么最多可以划分21次,减去一次就是20次,根据划分思路,最右下角的正方形可以划分5次,边长为2的正方形有5个,最终也是划分五次。划分路径上的正方形最多是十次。结合这个,当k取1-21之间的任意数时,都可以成功划分。(想一想,为什么)
综上,当n>=3时,当k能被用尽的情况下,必然能够满足条件(成功划分),使得路径上的小正方形边长相等。
我们再来分析n=2的情况,易知当k=3时,不能成功划分,其余都可以。
对于n=1,就不用说了。
综上,首先判断k次划分机会是否能用完,然后除开n=2,k=3的特例,根据划分思路进行划分。
Update:
后来又想了一下,可以把这个简化一下,比如现在我们对于左边和右边的正方形划分了x-1次,那么划分的总次数就为22-1+23-1+...+2x-1=2x+1-3-x次,对于右下角的正方形划分总次数至少也可以为
(4x-1-1)/3,现在还是有k<2x+1-1。
令2x+1-3-x+(4x-1-1)/3>=2x+1-1解得x>=3。
即当操作了x-1>=2次之后,k都能被用尽,加上之前划分的那一次,就是3次。
最终可以得出,当n>=3时,k都能够被用尽,就不用像我之前那么麻烦了,最后单独看一下n=1,n=2的情况就ok了。
代码如下:
#include <bits/stdc++.h>
using namespace std; typedef long long ll ; ll pathl(ll n,ll k){
k--;
ll pow2 = ,cnt = ;
while(k>=pow2-){
cnt++;
k-=(pow2-);
pow2*=;
}
return max(n--cnt,(ll));
}
int main(){
ll t,n,k;
cin>>t;
while(t--){
cin>>n>>k;
if(n== && k==){
puts("NO");continue ;
}
ll pow4=,tmp1=k,tmp2=n;
if(n<=){
while(tmp2--){
tmp1-=pow4;
pow4*=;
}
if(tmp1>){
puts("NO");continue;
}
printf("YES %d\n",pathl(n,k));
}else{
printf("YES %d\n",pathl(n,k));
}
} return ;
}
总得来说,这题的关键就是划分思路,其余都可以推导出来。
Codeforces Round #524 (Div. 2) D. Olya and magical square的更多相关文章
- Codeforces Round #524 (Div. 2)(前三题题解)
这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...
- Codeforces Round #524 (Div. 2) Solution
A. Petya and Origami Water. #include <bits/stdc++.h> using namespace std; #define ll long long ...
- Codeforces Round #877 (Div. 2) D. Olya and Energy Drinks
题目链接:http://codeforces.com/contest/877/problem/D D. Olya and Energy Drinks time limit per test2 seco ...
- Codeforces Round #524 (Div. 2) F. Katya and Segments Sets(主席树)
https://codeforces.com/contest/1080/problem/F 题意 有k个区间,区间的种类有n种,有m个询问(n,m<=1e5,k<=3e5),每次询问a,b ...
- Codeforces Round #524 (Div. 2) E. Sonya and Matrix Beauty(字符串哈希,马拉车)
https://codeforces.com/contest/1080/problem/E 题意 有一个n*m(<=250)的字符矩阵,对于每个子矩阵的每一行可以任意交换字符的顺序,使得每一行每 ...
- Codeforces Round #524 (Div. 2) C. Masha and two friends(矩形相交)
C. Masha and two friends time limit per test 1 second memory limit per test 256 megabytes input stan ...
- Codeforces Round #524 (Div. 2) B. Margarite and the best present
B. Margarite and the best present 题目链接:https://codeforces.com/contest/1080/problem/B 题意: 给出一个数列:an=( ...
- Codeforces Round #524 (Div. 2) codeforces 1080A~1080F
目录 codeforces1080A codeforces 1080B codeforces 1080C codeforces 1080D codeforces 1080E codeforces 10 ...
- Codeforces Round #524 (Div. 2)C 二维坐标系求俩矩形面积交
题:https://codeforces.com/contest/1080/problem/C 题意:给n*m的二维坐标系,每个位置(xi,yi)都表示一个方格,(1,1)的位置是白色,整个坐标系黑白 ...
随机推荐
- Leecode刷题之旅-C语言/python-118杨辉三角
/* * @lc app=leetcode.cn id=118 lang=c * * [118] 杨辉三角 * * https://leetcode-cn.com/problems/pascals-t ...
- clear()、sync()、ignore()
#include <iostream> using namespace std; int main() { int a; cin>>a; cout<<cin.rds ...
- (数据科学学习手札12)K-means聚类实战(基于R)
上一篇我们详细介绍了普通的K-means聚类法在Python和R中各自的实现方法,本篇便以实际工作中遇到的数据集为例进行实战说明. 数据说明: 本次实战样本数据集来自浪潮集团提供的美团的商家信息,因涉 ...
- STL 入门 (17 暑假集训第一周)
快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...
- 一种简单实用的双向电平转换电路3.3V-5V
当你使用3.3V的单片机的时候,电平转换就在所难免了,经常会遇到3.3转5V或者5V转3.3V的情况,这里介绍一个简单的电路,他可以实现两个电平的相互转换(注意是相互哦,双向的,不是单向的!).电路十 ...
- 2007: [Noi2010]海拔
2007: [Noi2010]海拔 https://www.lydsy.com/JudgeOnline/problem.php?id=2007 分析: 平面图最小割. S在左下,T在右上,从S到T的一 ...
- [转] Bash脚本:怎样一行行地读文件(最好和最坏的方法)
用bash脚本读文件的方法有很多.请看第一部分,我使用了while循环及其后的管道命令(|)(cat $FILE | while read line; do … ),并在循环当中递增 i 的值,最后, ...
- html5判断设备的动作
相应的事件 deviceorientation事件提供设备的物理方向信息,表示为一系列本地坐标系的旋角. devicemotion事件提供设备的加速信息,表示为定义在设备上的坐标系中的卡尔迪坐标.其还 ...
- Sql面试题之三(难度:简单| 含答案)
Sql面试题之三(难度:简单| 含答案) 答案: .SELECT B.name, B.Depart T.Content FROM B, T WHERE ( T.Content = '税法培训' and ...
- 3、shader深度测试(Cull、ZWrite 、ZTest )
剔除和深度测试是渲染法线中的一个流程 Cull:默认情况下,Unity中给的所有Shader都是单面的,它都把反面的渲染给关闭掉了,如果你在开发的过程中需要使用到双面,只要把cull关闭(off)即可 ...