AcWing 113. 特殊排序
有关数据#
题目大意#
有 个元素,编号 ,每一对元素之间的大小关系是确定的,关系具有反对称性,但不具有传递性。
注意:不存在两个元素大小相等的情况。
也就是说,元素的大小关系是 个点与 条有向边构成的任意有向图。
然而,这是一道交互式试题,这些关系不能一次性得知,你必须通过不超过 次提问来获取信息,每次提问只能了解某两个元素之间的关系。
将 ¥N¥ 个元素排好序后,把他们的编号以数组的形式输出,如果答案不唯一,则输出任意一个均可。
提示#
解法分析#
这道题我们采用二分。
首先,考虑归纳法。如果已经确定了前 个元素的大小关系,那么对于第 个数,我们可以尝试二分。
因为前 个数是单调递增的,所以二分前 个数。如果小于,往上区间走;否则,往下区间走。这样,总的询问次数是 ,题目可以接受。
至此,我们做出了这一题。
至于为什么二分一定能搜到……?这需要说吗?
AC Code#
# include <bits/stdc++.h>
using namespace std;
# define ll long long
# define lf double
# define GO(i,a,b) for(ll i = a; i <= b; i ++)
# define RO(i,b,a) for(ll i = b; i >= a; i --)
# define FO(i,u,head,e) for(int i = head[u]; i; i = e[i].next)
# define CI const int
# define pii pair<int,int>
# define MP(a,b) make_pair(a, b)
# define PB push_back
# define mem(a,x) memset(a, x, sizeof a)
# define F first
# define S second
// Forward declaration of compare API.
// bool compare(int a, int b);
// return bool means whether a is less than b.
class Solution {
public:
vector<int> specialSort(int n) {
vector <int> ans;
ans.PB(1);
GO (i, 2, n){
int l = 1, r = i - 1;
int pos = 0;
while (l <= r){
int mid = (l + r) >> 1;
bool res = compare(ans[mid - 1], i);
if (res){
pos = mid;
l = mid + 1;
}
else r = mid - 1;
}
ans.insert(ans.begin() + pos, i);
}
return ans;
}
};
作者:DE_aemmprty
出处:https://www.cnblogs.com/aemmprty/p/Special_Sort.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库