Submission #1312382

#TimeUsernameProblemLanguageResultExecution timeMemory
1312382repmannSličnost (COI23_slicnost)C++20
17 / 100
90 ms4288 KiB
#include <bits/stdc++.h>
using namespace std;
int N, W, K, Q;
int A[100001], B[100001], I[100001];
struct Node
{
  int mx, cnt, p;
}ST[400001];
inline void Merge(int i)
{
  if(i >= W) return;
  ST[i].mx = max(ST[i << 1].mx, ST[i << 1 | 1].mx);
  ST[i].cnt = 0;
  ST[i].cnt += (ST[i << 1].mx == ST[i].mx) * ST[i << 1].cnt;
  ST[i].cnt += (ST[i << 1 | 1].mx == ST[i].mx) * ST[i << 1 | 1].cnt;
  return;
}
inline void Setup()
{
  W = 1;
  while(W < (N - K + 1)) W <<= 1;
  for(int i = 1; i <= (N - K + 1); i++) ST[i + W - 1] = {0, 1, 0};
  for(int i = W - 1; i; i--) Merge(i);
  return;
}
inline void Propagate(int i)
{
  if(!ST[i].p) return;
  if(i < W)
  {
    ST[i << 1].p += ST[i].p;
    ST[i << 1 | 1].p += ST[i].p;
  }
  ST[i].mx += ST[i].p;
  ST[i].p = 0;
  return;
}
inline void Add(int l, int r, int x, int i = 1, int lc = 1, int rc = W)
{
  Propagate(i);
  if((l > rc) || (lc > r)) return;
  if((l <= lc) && (rc <= r)) {ST[i].p += x; return Propagate(i);}
  int s = (lc + rc) >> 1;
  Add(l, r, x, i << 1, lc, s);
  Add(l, r, x, i << 1 | 1, s + 1, rc);
  Merge(i);
  return;
}
int main()
{
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> N >> K >> Q;
  for(int i = 1; i <= N; i++) cin >> A[i];
  for(int i = 1; i <= N; i++) cin >> B[i];
  for(int i = 1; i <= N; i++) I[B[i]] = i;
  Setup();
  map <int, int> MAP;
  for(int i = 1; i <= K; i++) Add(max(I[A[i]] - K + 1, 1), min(I[A[i]], N - K + 1), +1);
//  cout << ST[1].mx << ' ' << ST[1].cnt << '\n';
  MAP[ST[1].mx] += ST[1].cnt;
  for(int i = K + 1; i <= N; i++)
  {
    Add(max(I[A[i - K]] - K + 1, 1), min(I[A[i - K]], N - K + 1), -1);
//    cout << ST[1].mx << ' ' << ST[1].cnt << '\n';
    Add(max(I[A[i]] - K + 1, 1), min(I[A[i]], N - K + 1), +1);
//    cout << ST[1].mx << ' ' << ST[1].cnt << '\n';
    MAP[ST[1].mx] += ST[1].cnt;
  }
  cout << MAP.rbegin()->first << ' ' << MAP.rbegin()->second << '\n';

  return 0;
}
#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...