#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx,avx2,sse,sse4")
#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int>> diag;
int dt[10005];
int queries[105];
vector<int> comp;
vector<int> ans[10005];
int psum[10005];
int N, K;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N >> K;
for (int i = 1; i <= N; i ++) cin >> dt[i];
int Q;
cin >> Q;
for (int i = 1; i <= Q; i ++) {
cin >> queries[i];
comp.push_back(queries[i]);
}
sort(comp.begin(), comp.end());
comp.resize(unique(comp.begin(), comp.end()) - comp.begin());
for (int i = 1; i <= N; i ++) ans[i].resize(comp.size()+1);
// Make the diagonals
for (int i = 2; i <= N; i ++) {
diag.clear();
int I = i, J = 1;
while (max(I, J) <= N) {
diag.push_back({I, J});
I ++, J ++;
}
int n = diag.size();
for (int i = 0; i <= n; i ++) psum[i] = 0;
for (int i = 0; i < n; i ++) if (dt[diag[i].first] == dt[diag[i].second]) {
// update the diagonal
int p = max(0, i - K + 1);
psum[p] ++, psum[i+1] --;
}
for (int i = 0; i < n; i ++) {
if (i > 0) psum[i] += psum[i-1];
auto [a, b] = diag[i];
if (a + K - 1 > N or b + K - 1 > N) break;
int ind = lower_bound(comp.begin(), comp.end(), K-psum[i]) - comp.begin();
ans[a][ind] ++;
}
}
for (int j = 2; j <= N; j ++) {
diag.clear();
int I = 1, J = j;
for (int I = 1, J = j; I <= N and J <= N; I ++, J ++) {
diag.push_back({I, J});
}
int n = diag.size();
for (int i = 0; i <= n; i ++) psum[i] = 0;
for (int i = 0; i < n; i ++) if (dt[diag[i].first] == dt[diag[i].second]) {
// update the diagonal
int p = max(0, i - K + 1);
psum[p] ++, psum[i+1] --;
}
for (int i = 0; i < n; i ++) {
if (i > 0) psum[i] += psum[i-1];
auto [a, b] = diag[i];
if (a + K - 1 > N or b + K - 1 > N) break;
int ind = lower_bound(comp.begin(), comp.end(), K-psum[i]) - comp.begin();
ans[a][ind] ++;
}
}
for (int j = 1; j <= N; j ++) for (int i = 1; i < ans[j].size(); i ++) ans[j][i] += ans[j][i-1];
for (int i = 1; i <= Q; i ++) {
int ind = lower_bound(comp.begin(), comp.end(), queries[i]) - comp.begin();
for (int j = 1; j <= N-K+1; j ++) {
cout << ans[j][ind] << " ";
}
cout << "\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |