loj516dp一般看规律
STL
这。。。我只能说是。。。考得是。。。
STL的正确用法?
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #include<vector> #include<queue> #include<set> #include<map> #include<stack> #include<bitset> #define ll unsigned long long #define pi 3.14 #define eps 1e-9 #define inf 2147483233 #define m(a) memset(a,0,sizeof(a)) #define M(a) memset(a,127,sizeof(a)) #define REP(i,m,n) for(int i=1;i<=n;i++) #define DWN(i,n,m) for(int i=n;i>=1;i++) #define lowbit(x) x&(-x) #define SS set<int> using namespace std; map <int,SS> mp; int n,m,x,ans=inf; 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()) it--,ans=min(ans,y-*it); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&x); update(x,i); mp[x].insert(i); } for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); if(a==b) { printf("%d\n",ans); continue; } if(mp[a].size()>mp[b].size()) swap(mp[a],mp[b]); for(set<int>::iterator it=mp[a].begin();it!=mp[a].end();it++) { update(b,*it); mp[b].insert(*it); } mp[a].clear(); printf("%d\n", ans); } return 0; }