1. 程式人生 > >#516. 「LibreOJ β Round #2」DP 一般看規律 stl容器

#516. 「LibreOJ β Round #2」DP 一般看規律 stl容器

題目連結
題意:給你一個n個數的陣列, 由若干詢問,每次詢問把陣列中所有值為x的改為y, 求兩個相同數最近的距離是多少。
思路:維護一個map 記錄所有下標為x出現的位置, 每次查詢更新即可。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace
std; map <int, set<int> >mp; int ans; void solve(int b, int x) { set<int>::iterator it = mp[b].lower_bound(x); if(it!=mp[b].end()) ans=min(ans, *(it)-x); if(it!=mp[b].begin()) ans=min(ans, x-*(--it)); } int main() { int n, m; while(~scanf("%d %d"
, &n, &m)) { mp.clear(); ans= 2147483647; for(int i=1;i<=n;++i) { int x; scanf("%d", &x); mp[x].insert(i); } for(int i=1;i<=m;++i) { int a, b; scanf("%d %d", &a, &b); if
(a==b) { cout<<ans<<endl; continue; } for(set<int>::iterator it=mp[a].begin(); it!=mp[a].end();++it) { solve(b, *it); mp[b].insert(*it); } mp[a].clear(); cout<<ans<<endl; } } return 0; }