专栏文章
AT_arc205_c 题解
AT_arc205_c题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minys86t
- 此快照首次捕获于
- 2025/12/02 10:33 3 个月前
- 此快照最后确认于
- 2025/12/02 10:33 3 个月前
赛时以为只有样例 2 的情况是无解的,假了但竟然 A 掉了,嘻嘻。
考虑什么情况下无解。
按 排序,如果有一个 满足 就是无解。
就是两种情况。一种是我赛时想到的方向不同的路线有交叉无解。还有就是出现包含关系的无解。都可以被上面的方法判掉,很巧妙。
我们把向右走的从大到小排序,把向左走的从小到大排序。其实按哪个端点排无所谓,因为不可能出现包含的情况,无解已经判过了。
然后因为方向不同的路线不会出现交叉(同理,无解判过了),所以哪个方向的先走也无所谓。只要保证向右走的大的先走,向左走的小的先走就行了。
AC Code
CPP#include<bits/stdc++.h>
#define int long long
#define r(x) for (int i = 1; i <= x; i++)
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define reb(i, a, b) for (int i = a; i >= b; i--)
using namespace std;
const int N = 5e5 + 50;
int n, s, t, cntl, cntr;
pair<int, int> p[N], l[N], r[N];
signed main()
{
cin.tie(0)->sync_with_stdio(0);
cin >> n;
r(n)
{
cin >> s >> t;
p[i] = make_pair(s, t);
if (s < t) l[++cntl] = make_pair(-s, i);
// 懒得写 cmp 所以直接变负数就是从大到小排了
else r[++cntr] = make_pair(s, i);
}
sort(p + 1, p + n + 1);
sort(l + 1, l + cntl + 1);
sort(r + 1, r + cntr + 1);
r(n - 1) if (p[i].second > p[i + 1].second)
return cout << "No", 0;
cout << "Yes\n";
r(cntl) cout << l[i].second << " ";
r(cntr) cout << r[i].second << " ";
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...