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

试题描述

给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作。

每次操作的内容为:给定 \(x,y\),序列中所有 \(x\) 会变成 \(y\)。

同时我们有一份代码:

int ans = 2147483647;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
if (a[i] == a[j])
ans = std::min(ans, j - i);
}
}
std::cout << ans << std::endl;

请在每次修改后输出代码运行的结果。

输入

第一行两个数,表示 \(n,m\)。

第二行 \(n\) 个数,表示 \(a_1,a_2,\cdots, a_n\)。

然后 \(m\) 行每行两个数 \(x\) 和 \(y\),表示序列中所有 \(x\) 会变成 \(y\)。

输出

对于每次修改,输出答案。

输入示例

5 10
2 7 6 3 8
6 1
7 1
1 3
5 6
1 7
9 5
1 10
7 6
7 5
3 9

输出示例

2147483647
1
1
1
1
1
1
1
1
1

数据规模及约定

\(1 \leq n, m \leq 100000\)

每个出现的数字绝对值均在int范围内。

题解

启发式合并,维护每种数字在序列中的位置,用个 set 偷一发懒。【还有 unordered_map】

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <unordered_map>
#include <set>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 100010 unordered_map <int, int> id;
set <int> pos[maxn*3];
int n, q, cnt, real[maxn*3]; struct Que {
int a, b;
Que() {}
Que(int _, int __): a(_), b(__) {}
} qs[maxn]; int main() {
n = read(); q = read();
for(int i = 1; i <= n; i++) {
int x = read();
if(!id.count(x)) id[x] = ++cnt, real[cnt] = cnt;
pos[id[x]].insert(i);
}
for(int i = 1; i <= q; i++) {
int a = read(), b = read();
qs[i] = Que(a, b);
if(!id.count(a)) id[a] = ++cnt, real[cnt] = cnt;
if(!id.count(b)) id[b] = ++cnt, real[cnt] = cnt;
} int ans = 2147483647;
for(int i = 1; i <= q; i++) {
if(qs[i].a == qs[i].b){ printf("%d\n", ans); continue; }
int a = id[qs[i].a], b = id[qs[i].b];
if(pos[real[a]].size() > pos[real[b]].size()) swap(real[a], real[b]);
a = real[a]; b = real[b];
for(auto A: pos[a]) {
set <int> :: iterator it = pos[b].lower_bound(A);
if(it != pos[b].end()) ans = min(ans, *it - A);
if(it != pos[b].begin()) ans = min(ans, A - *(--it));
pos[b].insert(A);
}
pos[a].clear();
printf("%d\n", ans);
} return 0;
}

注:代码是 C++11 的,偷懒用 unordered_map 和 auto。

总有那么一段时间天天犯 SB。。。

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

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

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

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

    传送门:https://loj.ac/problem/516 [题解] 那段代码求的是相同的数中间隔最小的值. 离散后用set维护每个值出现次数,每次操作相当于合并两个set,这步可以启发式合并. 加 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 小常识:变量的修饰符和DEMO

    public static string ss = "这是全局静态变量";//生命周期:程序结束为止,可以修改 public string s = "这是全局变量&quo ...

  2. 2018.5.6 解决问题:oracle------ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务

    解决问题:ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 或者是重启电脑之后无法进入控制台企业管理器(OEM)图形化界面(重新添加注入监听器就行了 文件listener.org) ...

  3. 【转】JavaScript 节点操作 以及DOMDocument属性和方法

    最近发现DOMDocument对象很重要,还有XMLHTTP也很重要 注意大小写一定不能弄错. 属性: 1Attributes 存储节点的属性列表(只读) 2childNodes 存储节点的子节点列表 ...

  4. FTP服务器建立windows与Linux的文件共享与读写操作

    centos7搭建vsftpd  2018-11-15 我们有时想要windows与Linux互传文件,就要用到vsftpd了.它仅仅在windows上面操作,就可以实现与Linux的通信,详情如下: ...

  5. javaweb基础(6)_servlet配置参数

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  6. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)

    A. Broken Clock time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  7. 将php数组转js数组,js如何接收PHP数组,json的用法

    首先下载下面这个文件(这是一段是别人写出来专门解析json的代码),然后引入这个文件! http://pan.baidu.com/s/1dD8qVr7 现在当我们需要用ajax与后台进行交互时,怎样将 ...

  8. 让Python带你看一场唯美的横飘雪!

    “北国风光,千里冰封,万里雪飘”,这句诗描写了一句美丽肃静的风光图,恰逢昨天笔者这边也下了一场比较大的雪,要不今天就用Python带大家也来领略一次美丽的雪景? 开发环境 版本:Python3.6 系 ...

  9. perl-basic-分支&循环

    if elsif shorter if: if+condition放在句子尾部. use strict; use warnings; my $word = "antidisestablish ...

  10. UVa - 1592 Database(STL,优化)

    给一个n行m列的数据库表格,问有没有两个行 r1,r2 和 c1,c2,满足(r1,r2)的元素=(c1,c2)的元素. n≤10000,m≤10. 直接枚举4个肯定会T的.可以只枚举c1 c2,然后 ...