Codeforces 976C 题解报告

柔情只为你懂 2022-05-26 13:12 249阅读 0赞

一、题目

http://codeforces.com/contest/976/problem/C

二、思路

对数据进行排序:
(1)按左边的数从小到大排;
(2)若左边的数相等,则按右边的数从大到小排。

排序之后,若一个数的右边的数小于等于上一个数的右边的数,则这两个数必然符合题意。
比如

  1. 2 13
  2. 2 12
  3. 1 11

排序之后,变为

  1. 1 11
  2. 2 13
  3. 2 12

因为12 < 13,则有<2, 12>被包含在它的上一个数<2, 13>之内。

三、代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define x first
  4. #define y second
  5. typedef pair<int, int> pt;
  6. const int N = 300 * 1000 + 13;
  7. int n;
  8. pair<pt, int> a[N];
  9. int main()
  10. {
  11. scanf("%d", &n);
  12. for (int i = 0; i < int(n); i++)
  13. {
  14. scanf("%d%d", &a[i].x.x, &a[i].x.y);
  15. a[i].y = i + 1;
  16. }
  17. // 这里用到了lambda函数,[&]表示引用传递
  18. // 先按a.x.x从小到大排列;若a.x.x相同,则按a.x.y从大到小排列
  19. sort(a, a + n, [&](pair<pt, int> a, pair<pt, int> b)
  20. {
  21. if (a.x.x != b.x.x)
  22. {
  23. return a.x.x < b.x.x;
  24. }
  25. return a.x.y > b.x.y;
  26. });
  27. set<pt> cur;
  28. for (int i = 0; i < int(n); i++)
  29. {
  30. while (!cur.empty() && cur.begin()->x < a[i].x.x)
  31. {
  32. // 若之前的数的y比当前数的x还小,则把之前的数从cur中全部移除
  33. // 比如之前的数为<1,5>和<2,6>,当前数<10,20>,则把<1,5>和<2,6>移除
  34. cur.erase(cur.begin());
  35. }
  36. // 经过sort排序后,当前数的x,一定大于或等于上个数的x
  37. // 若当前数的y,小于或等于上个数的y,则符合题意输出结果
  38. if (!cur.empty() && (--cur.end())->x >= a[i].x.y)
  39. {
  40. printf("%d %d\n", a[i].y, (--cur.end())->y);
  41. return 0;
  42. }
  43. cur.insert({a[i].x.y, a[i].y});
  44. }
  45. puts("-1 -1");
  46. return 0;
  47. }

TopCoder & Codeforces & AtCoder交流QQ群:648202993
更多内容请关注微信公众号
wechat\_public.jpg

发表评论

表情:
评论列表 (有 0 条评论,249人围观)

还没有评论,来说两句吧...

相关阅读