Submission #1346498

#TimeUsernameProblemLanguageResultExecution timeMemory
1346498bakhtiyarnTable Tennis (info1cup20_tabletennis)C++20
0 / 100
234 ms60088 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int N = 3e5+5;
int a[N];
int n, k; 
unordered_map<int, int> pos;

vector<int> build(int dif){
  vector<int> pre(n+k+5);
  vector<array<int, 2>> from1(n+k+5);
  for(int i=1; i<=n+k; i++){
    pre[i] = pre[i-1];
    from1[i] = {i-1, 0};
    
    if(pos[a[i]-dif]) {
      if(pre[i] < pre[pos[a[i]-dif]] + 1){
        pre[i] = pre[pos[a[i]-dif]] + 1;
        from1[i] = {pos[a[i]-dif], i};
      }
    } else if(pre[i] == 0){
      pre[i] = 1;
      from1[i] = {0, i};
    }
  }
  
  vector<int> suf(n+k+5);
  vector<array<int, 2>> from2(n+k+5);
  for(int i=n+k; i>=1; i--){
    suf[i] = suf[i+1];
    from2[i] = {i+1, 0};
    
    if(pos[a[i]+dif]) {
      if(suf[i] < suf[pos[a[i]+dif]] + 1){
        suf[i] = suf[pos[a[i]+dif]] + 1;
        from2[i] = {pos[a[i]+dif], i};
      }
    } else if(suf[i] == 0){
      suf[i] = 1;
      from2[i] = {n+k+1, i};
    }
  }
  
  int idx = -1;
  for(int i=1; i<=n+k; i++){
    // cout << suf[i+1] << endl;
    if(min(pre[i], suf[i+1])*2 < n) continue;
    // cout << pre[i] << endl;
    idx = i;
  }
  if(idx == -1) return {};
  
  vector<int> ans;
  
  int i = idx;
  while(i >= 1){
  
    if(from1[i][1] == 0){
      i--;
      continue;
    }
    ans.push_back(a[from1[i][1]]);
    i = from1[i][0];
  }
  
  reverse(ans.begin(), ans.end());
  while(ans.size() > n/2) ans.pop_back();
  
  
  
  i = idx+1;
  while(i <= n+k){
    // cout << i << endl;
    if(from2[i][1] == 0){
      i++;
      continue;
    }
    ans.push_back(a[from2[i][1]]);
    i = from2[i][0];
    
  }
  // for(int i: ans) cout << i << " ";
  // cout << endl;
  
  while(ans.size() > n) ans.pop_back();
  return ans;
}

// for(int i=1; i<=n; i++) 
void solve(){
  cin >> n >> k;
  for(int i=1; i<=n+k; i++) cin >> a[i];
  for(int i=1; i<=n+k; i++) pos[a[i]] = i;
  
  for(int l=1; l<=2+k; l++){
    for(int r=l+1; r<=2+k; r++){
      int dif = a[r] - a[l];
      vector<int> ans = build(dif);
      
      // cout << dif << endl;
      // if(dif == 1) {
      //   for(int i: ans) cout << i << " ";
      //   cout << endl;
      // }
      
      if(ans.size() == n) {
        for(int i: ans) cout << i << " ";
        return;
      }
    }
  }
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...