제출 #617170

#제출 시각아이디문제언어결과실행 시간메모리
617170FatihSolakLottery (CEOI18_lot)C++17
100 / 100
511 ms8424 KiB
#include <bits/stdc++.h>
#define N 10005
#define K 105
using namespace std;
int pre[N][K];
int a[N];
int k[K];
int num[N];
int sum[N];
void solve(){
	int n,l,q;
	cin >> n >> l;
	for(int i = 1;i<=n;i++){
		cin >> a[i];
	}
	cin >> q;
	vector<int> queries;
	for(int i = 1;i<=q;i++){
		cin >> k[i];
		queries.push_back(k[i]);
	}
	sort(queries.begin(),queries.end());
	queries.resize(unique(queries.begin(),queries.end())-queries.begin());
	int cnt = queries.size();
	for(int i = l;i>=0;i--){
		while(cnt && queries[cnt-1] >= i)
			cnt--;
		num[i] = cnt;
	}
	for(int i = 1;i<n;i++){
		sum[i] = 0;
		for(int j = i+1;j<=n;j++){
			sum[j] = sum[j-1] + (a[j] != a[j-i]);
		}
		for(int j = i+1;j+l-1<=n;j++){
			int dif = sum[j + l-1] - sum[j-1];
			dif = num[dif];
			pre[j][dif]++;
			pre[j-i][dif]++;
		}
	}
	for(int i = 1;i<=n;i++){
		for(int j = 1;j<K;j++){
			pre[i][j] += pre[i][j-1];
		}
	}
	for(int i = 1;i<=q;i++){
		int idx = num[k[i]];
		for(int j = 1;j+l-1<=n;j++){
			cout << pre[j][idx] << ' ';
		}
		cout << '\n';
	}

}	
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	#ifdef Local
		freopen("in.txt","r",stdin);
		freopen("out.txt","w",stdout);
	#endif
	int t = 1;
	//cin >> t;
	while(t--){
		solve();
	}
	#ifdef Local
		cout << endl << fixed << setprecision(2) << 1000.0*clock()/CLOCKS_PER_SEC << " milliseconds";
	#endif
}
#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...