CF1715F题解
CF1715F
题意
给定一个
解析
这题在CF上有计算几何标签,但没涉及什么计算几何相关,更像是一道思维题。
官方题解为使用横纵两个方向的锯齿形多边形进行两次询问。这里使用另一种思路,仅从横向(或纵向)单个方向构造多边形,使用 2 到 3 次询问。
这里使用下面样例进行解释:
6 5
2.2 3
由于要查找的正方形边长固定为
作为第一次询问,我们得到
第二次询问将第一次询问的多边形向右移动
如果询问得到的
第三次询问。先设偏移距离
构造如图多边形,如图中所示,
第三次询问得到的面积
(利用直线方程
代码
#include <bits/stdc++.h>
#include <unordered_map>
#define LL long long
#define pii pair<int, int>
#define pll pair<LL, LL>
#define double long double
#define pdd pair<double, double>
#define eps 1e-15
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;
double res1, res2, l, res3;
cin >> n >> m;
//第一次询问
printf("? %d\n", max(n + 1 >> 1 << 2, 8)); //这里取至少8是因为循环前后直接进行了两次坐标输出
printf("0 -1\n0 %d\n1 %d\n1 0\n", m, m);
int idx = 3;
for (; idx <= n - 2; idx += 2)
printf("%d 0\n%d %d\n%d %d\n%d 0\n", idx - 1, idx - 1, m, idx, m, idx);
printf("%d 0\n%d %d\n%d %d\n%d -1\n", idx - 1, idx - 1, m, idx, m, idx);
fflush(stdout);
cin >> res1;
if (fabs(res1 - (double)1.0) <= eps || fabs(res1 - (double)0.0) <= eps) //对横坐标在允许误差内是否为整数进行判断
l = 0.0;
else
{
//第二次询问
printf("? %d\n",max(n + 1 >> 1 << 2, 8));
printf("%.15LF -1\n%.15LF %d\n%.15LF %d\n%.15LF 0\n", (double)1.0 - res1, (double)1.0 - res1, m, (double)2.0 - res1, m, (double)2.0 - res1);
int idx = 3;
for (; idx <= n - 2; idx += 2)
printf("%.15LF 0\n%.15LF %d\n%.15LF %d\n%.15LF 0\n", (double)idx - res1, (double)idx - res1, m, (double)(idx + 1) - res1, m, (double)(idx + 1) - res1);
printf("%.15LF 0\n%.15LF %d\n%.15LF %d\n%.15LF -1\n", (double)idx - res1, (double)idx - res1, m, (double)(idx + 1) - res1, m, (double)(idx + 1) - res1);
fflush(stdout);
cin >> res2;
if (fabs(res2 - (double)1.0) <= eps)
l = (double)1.0 - res1;
else
l = res1;
}
//第三次询问
printf("? %d\n", (n << 2) + 1);
double step = 0.00390625; //步长设为2的幂次防止丢精度
printf("%.15LF -1\n%.15LF -1\n%.15LF %d\n%.15LF 0\n%.15LF 0\n", l + (double)n, l, l, m, l + step, l + (double)1.0);
for (int i = 1; i < n; i++)
printf("%.15LF %d\n%.15LF %d\n%.15LF 0\n%.15LF 0\n", l + (double)i, m, l + (double)i + (double)i * step, m, l + (double)i + (double)(i + 1) * step, l + (double)(i + 1));
fflush(stdout);
cin >> res3;
int xi = res3 / step;
double x = (double)xi + l, y = (double)m - (res3 - (double)xi * step) * ((double)m / step) - (double)0.5;
printf("! %.15LF %.15LF\n", x, y);
fflush(stdout);
}
最后祝各位顺利AC。>w<
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】