题意:给出一串序列(1e5个),每个数字介于1-1e6之间,给定一个A,要求:找到一个B,使得对于每个位置i:B的累计出现次数严格大于A的累计出现次数
题解:这个题属于预处理技巧。每次读入一个data,如果cnt[data]合法,即cnt[data]>cnt[A],那么把cnt继续++,否则,cnt[data]停止更新。然后读入所有数据之后,遍历寻找cnt比cnt[A]大的,就是答案。
Code:
#include<bits/stdc++.h> using namespace std; #define MAXN 105 bool use [MAXN]; int ans [MAXN]; int m,n; int main(){ int now; cin>>n>>m; cin>>now; for (int i=1;i<m;i++){ int temp; cin>>temp; int a = temp - now; if (a<=0){ a+=n; } if (ans[now]==0&&use[a]||ans[now]!=0&&ans[now]!=a){ cout<<"-1"<<endl; return 0; } use[a]=true; ans[now]=a; now= temp; } int as=1; for (int i=1;i<=n;i++){ if(ans[i]==0){ while(use[as])as++; cout<<as<<" "; as++; }else cout<<ans[i]<<" "; } return 0; }