传送门:https://loj.ac/problem/516

【题解】

那段代码求的是相同的数中间隔最小的值。

离散后用set维护每个值出现次数,每次操作相当于合并两个set,这步可以启发式合并。

加元素的时候直接找前驱和后继即可。

学了新姿势:set中insert有返回的,可以访问.first来调用新插入元素的iterator

  1. # include <set>
  2. # include <vector>
  3. # include <stdio.h>
  4. # include <string.h>
  5. # include <iostream>
  6. # include <algorithm>
  7. // # include <bits/stdc++.h>
  8.  
  9. using namespace std;
  10.  
  11. typedef long long ll;
  12. typedef long double ld;
  13. typedef unsigned long long ull;
  14. const int N = 1e5 + , M = 3e5 + ;
  15. const int mod = 1e9+, inf = ;
  16.  
  17. int n, m, a[N];
  18. struct quest {
  19. int x, y;
  20. }q[N];
  21. vector<int> ps;
  22. set<int> s[M];
  23. set<int>::iterator it, it2;
  24. int ans[M], Ans = inf, id[M];
  25.  
  26. inline int getid(int x) {
  27. return lower_bound(ps.begin(), ps.end(), x) - ps.begin() + ;
  28. }
  29.  
  30. int main() {
  31. cin >> n >> m;
  32. for (int i=; i<=n; ++i) {
  33. scanf("%d", a+i);
  34. ps.push_back(a[i]);
  35. }
  36. for (int i=; i<=m; ++i) {
  37. scanf("%d%d", &q[i].x, &q[i].y);
  38. ps.push_back(q[i].x); ps.push_back(q[i].y);
  39. }
  40. sort(ps.begin(), ps.end());
  41. ps.erase(unique(ps.begin(), ps.end()), ps.end());
  42. for (int i=; i<=n; ++i) a[i] = getid(a[i]);
  43. for (int i=; i<=m; ++i) q[i].x = getid(q[i].x), q[i].y = getid(q[i].y);
  44. for (int i=; i<=n; ++i) s[a[i]].insert(i);
  45. for (int i=; i<=ps.size(); ++i) {
  46. ans[i] = inf; id[i] = i;
  47. if(s[i].size() < ) continue;
  48. for (it = s[i].begin(), it2 = ++s[i].begin(); it2 != s[i].end(); ++it, ++it2)
  49. ans[i] = min(ans[i], *it2 - *it);
  50. Ans = min(Ans, ans[i]);
  51. }
  52. for (int i=, X, Y, x, tans; i<=m; ++i) {
  53. X = q[i].x, Y = q[i].y;
  54. if(!s[id[X]].size()) {
  55. printf("%d\n", Ans);
  56. continue;
  57. }
  58. if(!s[id[Y]].size()) {
  59. swap(id[X], id[Y]);
  60. printf("%d\n", Ans);
  61. continue;
  62. }
  63. tans = min(ans[id[X]], ans[id[Y]]);
  64. if(s[id[X]].size() > s[id[Y]].size()) swap(id[X], id[Y]);
  65. for (it = s[id[X]].begin(); it != s[id[X]].end(); ++it) {
  66. x = *it;
  67. it2 = s[id[Y]].insert(x).first;
  68. ++it2;
  69. if(it2 != s[id[Y]].end()) tans = min(tans, *it2 - x);
  70. --it2;
  71. if(it2 != s[id[Y]].begin()) --it2, tans = min(tans, x - *it2);
  72. }
  73. s[id[X]].clear();
  74. ans[id[Y]] = tans;
  75. ans[id[X]] = inf;
  76. Ans = min(Ans, tans);
  77. printf("%d\n", Ans);
  78. }
  79. return ;
  80. }

loj516 「LibreOJ β Round #2」DP 一般看规律的更多相关文章

  1. [LOJ#516]「LibreOJ β Round #2」DP 一般看规律

    [LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...

  2. LibreOJ #516. 「LibreOJ β Round #2」DP 一般看规律

    二次联通门 : LibreOJ #516. 「LibreOJ β Round #2」DP 一般看规律 /* LibreOJ #516. 「LibreOJ β Round #2」DP 一般看规律 set ...

  3. loj #547. 「LibreOJ β Round #7」匹配字符串

    #547. 「LibreOJ β Round #7」匹配字符串   题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...

  4. [LOJ#531]「LibreOJ β Round #5」游戏

    [LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...

  5. [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)

    [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 …… 接着他们发现自己收 ...

  6. [LOJ#530]「LibreOJ β Round #5」最小倍数

    [LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...

  7. [LOJ#515]「LibreOJ β Round #2」贪心只能过样例

    [LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...

  8. [LOJ#525]「LibreOJ β Round #4」多项式

    [LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...

  9. [LOJ#526]「LibreOJ β Round #4」子集

    [LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...

随机推荐

  1. Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  2. DAY3敏捷冲刺

    站立式会议 工作安排 (1)服务器配置 (2)数据库配置 燃尽图 燃尽图有误,已重新修改,先贴卡片的界面,后面补修改后燃尽图 代码提交记录

  3. java集合类小结

    1 集合的框架体系 List简介 集合的使用场合 List(链表|线性表)和Set(集) java.util.Collection ---| Collection 描述所有接口的共性 ----| Li ...

  4. python 查看趴下来的数据

    #coding=utf-8 import re from lxml import etree import requests def requests_view(response): import w ...

  5. CentOS基础命令

    为网卡配置静态IP地址建议通过交互式界面nmtui进行配置 firewalld和iptablesCentOS7使用firewald取代原来的iptables,但实际上底层还是iptables,在上层加 ...

  6. HSF原理

    HSF(High-speed Service Framework),高速服务框架,是阿里系主要采用的服务框架,其目的是作为桥梁联通不同的业务系统,解耦系统之间的实现依赖.其高速体现在底层的非阻塞I/O ...

  7. RT-thread 设备驱动组件之SPI设备

    本文主要介绍RT-thread中的SPI设备驱动,涉及到的文件主要有:驱动框架文件(spi_dev.c,spi_core.c,spi.h),底层硬件驱动文件(spi_hard.c,spi_hard.h ...

  8. byte字节的输入流 建议使用字节数组形式接受内容 因为当输入流是汉字时候 会超出字节的范围 出现无法读取的现象

    byte字节的输入流 建议使用字节数组形式接受内容 因为当输入流是汉字时候 会超出字节的范围 出现无法读取的现象

  9. Android Service 生命周期

    Service概念及用途: Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行 ...

  10. BZOJ1591 & 洛谷2924:[USACO2008 DEC]Largest Fence 最大的围栏——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1591 https://www.luogu.org/problemnew/show/P2924#sub ...