题解 ARC154D【A + B > C ?】
显然 对任意大于 的正整数 都不成立。利用这一点,我们可以在 次询问内问出 的位置。具体地,首先假设 为 ,记我们假设的为 位置为 。依次枚举 的每个数 ,问 是否成立。若成立,意味着 ,令 然后继续循环;若不成立,意味着 ,继续循环。循环结束后, 一定成立。
注意到 ,我们有了比较操作,只需对 进行排序即可。可以手写归并排序,但更方便的方法是写一个比较函数传进 stable_sort
里面。注意这里用 sort
可能会被卡,原因是 sort
递归到 小后就会使用插入排序,导致比较次数超限(次数限制比较紧)。
// Problem: D - A + B > C ?
// Contest: AtCoder - AtCoder Regular Contest 154
// URL: https://atcoder.jp/contests/arc154/tasks/arc154_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define per(x,y,z) for(int x=(y);x>=(z);x--)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do{freopen(s".in","r",stdin);freopen(s".out","w",stdout);}while(false)
using namespace std;
typedef long long ll;
const int N = 2e3+5;
int n, a[N], p[N];
template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}
int ask(int x, int y, int z) {
printf("? %d %d %d\n", x, y, z);
fflush(stdout);
char s[4];
scanf("%s", s);
return s[0] == 'Y';
}
void give(int* p, int n) {
printf("! ");
rep(i, 1, n) printf("%d%c", p[i], " \n"[i==n]);
fflush(stdout);
}
int main() {
scanf("%d", &n);
int pos1 = 1;
rep(i, 2, n) if(ask(pos1, pos1, i)) pos1 = i;
rep(i, 1, n) a[i] = i;
stable_sort(a+1, a+1+n, [=](int i, int j) {
return !ask(i, pos1, j);
});
rep(i, 1, n) p[a[i]] = i;
give(p, n);
// system("pause");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2022-01-24 题解 SP25844 / CF276D【MAXXOR - Find the max XOR value / Little Girl and Maximum XOR】