Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define boAshraf ios_base::sync_with_stdio(false); cin.tie(NULL);
- #define ll long long
- #define sz(s) (int)(s).size()
- #define all(s) (s).begin(),(s).end()
- using namespace std;
- void File();
- void sol();
- int main() {
- boAshraf
- File();
- int t = 1;
- // cin >> t;
- while (t--) {
- sol();
- }
- return 0;
- }
- void sol() {
- int n,k;
- cin >> n >> k;
- vector<int>a(n);
- for(auto &it:a)cin>>it;
- if(k <= 2)return void(cout<<0);
- vector<int>pre(n, 1), suff(n, 1);
- vector<int>difL(n), difR(n);
- {
- int mx = 1;
- for (int i = 1; i < n; i++) {
- if (i >= 2 && (a[i] - a[i - 1]) == (a[i - 1] - a[i - 2])) pre[i] = pre[i - 1] + 1; else pre[i] = 2;
- difL[i] = a[i] - a[i - 1];
- mx = max(mx, pre[i]);
- }
- for (int i = n - 2; i >= 0; i--) {
- if (i + 2 < n && (a[i + 1] - a[i]) == (a[i + 2] - a[i + 1])) suff[i] = suff[i + 1] + 1; else suff[i] = 2;
- difR[i] = a[i + 1] - a[i];
- mx = max(mx, suff[i]);
- }
- if (mx >= k) return void(cout<<0);
- }
- vector<int> vals=a;
- sort(all(vals));
- vals.erase(unique(all(vals)),vals.end());
- auto get_idx=[&](int x){
- auto it=lower_bound(all(vals), x);
- if(it==vals.end()||*it!=x) return -1;
- return (int)(it-vals.begin());
- };
- vector<vector<int>> idxs(sz(vals));
- for(int i=0; i < n; i++){
- int id=get_idx(a[i]);
- assert(~id);
- idxs[id].push_back(i);
- }
- map<pair<int,int>, pair<int,int>> best;
- int ans=1e9;
- for(int r=0; r < n; r++){
- if(suff[r] >= 2){
- int d=difR[r], needval= a[r] - d;
- int rem= k - suff[r];
- if(rem == 1){
- int id=get_idx(needval);
- if(~id){
- auto &v=idxs[id];
- auto p=lower_bound(all(v), r);
- if(p!=v.begin()){
- int l=*prev(p);
- ans=min(ans, r - l - 1);
- }
- }
- }
- else{
- auto it=best.find({needval, d});
- if(it != best.end()){
- auto [mx,l]=it->second;
- if(mx >= rem && l < r) ans=min(ans, r - l - 1);
- }
- }
- }
- if(pre[r] >= 2){
- pair<int,int> key={a[r], difL[r]};
- auto it=best.find(key);
- if(it == best.end() || pre[r] > it->second.first || (pre[r] == it->second.first && r > it->second.second))
- best[key]={pre[r], r};
- }
- }
- for(int l=0; l < n; l++) {
- if (pre[l] >= k - 1) {
- int t = a[l] + difL[l];
- int id = get_idx(t);
- if (~id) {
- auto &it = idxs[id];
- auto p = upper_bound(all(it), l);
- if (p != it.end()) {
- int r = *p;
- ans = min(ans, r - l - 1);
- }
- }
- }
- }
- cout<<(ans==1e9?-1:ans);
- }
- void File() {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- }
Advertisement
Add Comment
Please, Sign In to add comment