WHY吃糖果 QDUOJ 二分嵌套
2024-08-28 14:35:42
WHY吃糖果 QDUOJ 二分嵌套
题意
给出一个\(n*n\)的矩阵,每个格子的权值为\(i*i+j*j+i*j+100000*(i-j)\),求该矩阵中第m小的权值为多少
解题思路
当列数固定时,这个函数是随着行数的增加而增加的(二次函数简单判断下就行),于是外层的二分进行二分答案,里面的二分进行判断小于等于当前答案的格子有多少个。这样就可以解决问题。参考大佬的思路,可以点击查看。
代码实现
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f3f3f3f3f;
ll n, m;
ll mul(ll i, ll j)
{
return i*i+j*j+i*j+100000*(i-j);
}
ll judge(ll x)
{
ll ret=0;
for(ll j=1; j<=n; j++)
{
ll l=1, r=n, mid, tmp=0;
while(l<=r)
{
mid=(l+r)>>1; //这是行数
if(mul(mid, j) <= x)
{
tmp=mid;//在列数一定时,有多少个格子满足要求
l=mid+1;
}
else
r=mid-1;
}
ret+=tmp;//这里是所有的格子里面满足要求的格子数
}
return ret;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
ll L=-inf, R=inf, ans, mid;
cin>>n>>m;
while(L<=R)
{
mid=(L+R)>>1;
if(judge(mid) < m) //这里需要注意一下,没有等号
{
L=mid+1;
}
else
{
ans=mid;
R=mid-1;
}
}
printf("%lld\n", ans);
}
return 0;
}
最新文章
- 从刚刚「简书」平台的短暂异常,谈Nginx An error occurred报错~
- Position a child div relative to parent container in CSS: [设置 子DIV位置 跟 父DIV相关联]
- Java学习-004-传世经典Helloworld
- [老老实实学WCF] 第一篇 Hello WCF
- PHP+Mysql无限分类的方法汇总
- 【pano2vr】网页Flash中简单实现炫酷的3D模型制作
- gnome设置dvorak键盘布局
- Modem常用概念
- 关于Eclipse无法生成class文件的问题
- C - BLG POJ - 1417 种类并查集加dp(背包)
- 【转载】ASP.NET生成图片的缩略图
- mysql修改默认端口号后从windows命令行登录
- 每位 Ubuntu 18.04 用户都应该知道的快捷键 | Linux 中国
- git 修改默认编辑器
- MapReduce开发程序,运行环境配置
- 【转 记录】python中的encode以及decode
- Hadoop Hive sql 语法详解
- vue-router 懒加载优化
- apple 下安装mysql 以及 碰到的问题
- Ubuntu16.04系统中不同版本Python之间的转换