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 个数,表示 a1,a2,⋯,an .
然后 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≤n,m≤1000001≤n,m≤1000001≤n,m≤100000
每个出现的数字绝对值在 int 范围内。
Solution
题意:给出 MMM 个操作,将长度为 N" role="presentation" style="position: relative;">NNN 序列中 所有的 某一个数字替换为另一个,
询问每次操作后距离最近的两个 相同 数字的距离。
由于每个位置上的数都只对它的 前驱和后继 产生影响,
于是我们开 NNN 个 set" role="presentation" style="position: relative;">setsetset (每个数一个),每次启发式合并,将较小的暴力合并到大的上面。
每次在 setsetset 上 lower_bound()lower_bound()lower\_bound() 计算前驱和后继的贡献即可。
如果不想离散化就用个 mapmapmap 来存这 NNN 个 set" role="presentation" style="position: relative;">setsetset 。
时间复杂度 O(N log N)O(NlogN)O(N\ log\ N) ,常数较大。
Code
#include<cstdio>
#include<algorithm>
#include<set>
#include<map>
#include<cctype>
using namespace std;
map<int,set<int> >mp;
int ans=2147483647;
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline void update(int x,int y)
{set<int>::iterator it=mp[x].lower_bound(y);if(it!=mp[x].end()) ans=min(ans,*it-y);if(it!=mp[x].begin()) ans=min(ans,y-*--it);
}
int main()
{int n=read(),m=read();for(int i=1;i<=n;i++){int x=read();update(x,i);mp[x].insert(i);}while(m--){int x=read(),y=read();if(x^y){if(mp[x].size()>mp[y].size()) swap(mp[x],mp[y]);for(set<int>::iterator it=mp[x].begin();it!=mp[x].end();it++){update(y,*it);mp[y].insert(*it);}mp[x].clear();}write(ans),putchar('\n'); }return 0;
}
LOJ #516. 「LibreOJ β Round #2」DP 一般看规律相关推荐
- [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)
[LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 -- 接着他们发现自己收 ...
- [LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)
#521. 「LibreOJ β Round #3」绯色 IOI(抵达) description solution 因为点的庇护所不能为自身,题目背景在树上,有结论一定是两个相邻点互为庇护所 所以树一 ...
- loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...
$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...
- [线段树分治][DP] LOJ #534. 「LibreOJ Round #6」花团
Solution S o l u t i o n Solution 操作相当于是动态的做一个背包DP. 离线的话,线段树分治一下. 因为结尾是已知的,可以一边分治,得到一个修改操作,就插到线段树. 只 ...
- LOJ 572 「LibreOJ Round #11」Misaka Network 与求和——min_25筛
题目:https://loj.ac/problem/572 莫比乌斯反演得 \( ans=\sum\limits_{D=1}^{n}\left\lfloor\frac{n}{D}\right\rflo ...
- 【费用流】loj#545. 「LibreOJ β Round #7」小埋与游乐场
好像现在看来这个缩点的思路挺清晰啊 题目描述 有两个非负整数组成的可重集合 $A$ 和 $B$. 现在你可以对 $A$ 中至多 $k$ 个元素进行操作.操作方法为:设你准备操作且未被操作过的 $A$ ...
- [费用流] LOJ#545. 「LibreOJ β Round #7」小埋与游乐场
有两种操作是有效的 lowbit(ai)>lowbit(bj)lowbit(ai)>lowbit(bj)lowbit(a_i)>lowbit(b_j) 或者 ai=bjai=bja_ ...
- loj 523 「LibreOJ β Round #3」绯色 IOI(悬念) 霍尔定理+基环树+线段树
题目分析 神仙题(确信) 首先,j−aij-a _ ij−ai和ai−ja _ i-jai−j互为相反数,若其中最小值为bib _ ibi,则一个为bib _ ibi一个为m−bim-b _ ...
- Loj#572. 「LibreOJ Round #11」Misaka Network 与求和
题目 有生之年我竟然能\(A\) 这个题求的是这个 \[\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))^k\] \(f(i)\)定义为\(i\)的次大质因子,其中\(f(p)= ...
最新文章
- 安装npm_前端开发:node.js的node包管理器npm安装以及使用
- UVA 11491 Erasing and Winning 奖品的价值 (贪心)
- Java中的关键字——final
- 如何查看Eclipse版本
- C++ —— C++高手之路
- Hi3519V101开发环境搭建(一)
- 设计模式再学习之单例模式
- 使用计算机进行电路分析,计算机辅助电路分析,computer aided analysis of circuits,音标,读音,翻译,英文例句,英语词典...
- zuul网关_SpringCould之服务网关(zuul)介绍与配置
- 【C语言】C语言入门经典题目(范围广,内容多)
- 前端实现序列帧_canvas实现序列帧动画的案例
- Docker 镜像地址修改
- 监控摄像头网页直播解决方案
- css transition opacity,CSS transition属性
- 刺客信条奥德赛ce修改技能点_刺客信条奥德赛特长加点
- C++中的bool类型
- Allegro学习进行时
- 项目管理的完整流程是怎样的?
- Java算法--第二章--查找与排序(2)递归基础--佩波那契最大公约数插入排序汉诺塔
- 2022年9月青少年软件编程(图形化)等级考试试卷--三级--数星星