https://codeforces.com/contest/2215/problem/A
Problem - A - Codeforces
codeforces.com
모든 연산이 끝난 후, 모든 값은 다음 두가지중 하나가 됩니다.
이때 전체 배열에 연산을 끝내면 가능한 경우가 다음과 같습니다.
증명은 다음과 같습니다.
pf) 배열에 연산을 끝냈을 때 어떠한 상태가 가능함을 A, 위 조건을 만족함을 B라고 합시다.
그러므로 구간에 대해서 %p, %q %p를 한 값의 누적합을 구하고, 남은 구간에 대해서는 최적값을 저장하는 누적합을 만들면 O(N)에 문제를 해결할 수 있습니다.
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
ll arr[101010]={0},psum[101010]={0},pqsum[101010]={0},mnsum[101010]={0};
void solve()
{
ll N,k,p,q,i,x;
cin>>N>>k>>p>>q;
for (i=1;i<=N;i++)
{
cin>>arr[i];
psum[i]=psum[i-1]+arr[i]%p;
pqsum[i]=pqsum[i-1]+(arr[i]%q)%p;
mnsum[i]=mnsum[i-1]+min(arr[i]%p,(arr[i]%q)%p);
}
ll Ans=pqsum[N]; //일단 다 %q 후 %p를 하는거로 고려
for (i=k;i<=N;i++)
{
Ans=min(Ans,(mnsum[N]-mnsum[i]+mnsum[i-k])+(psum[i]-psum[i-k])); //중간에 길이 k의 %p를 넣기
Ans=min(Ans,(mnsum[N]-mnsum[i]+mnsum[i-k])+(pqsum[i]-pqsum[i-k])); //중간에 길이 k의 %q %p를 넣기
}
cout<<Ans<<"\n";
}
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL);
ll T;
cin>>T;
while (T--)
solve();
}

| Grid Covering (CF R 1091 Div.2 - C) (0) | 2026.04.18 |
|---|---|
| Unique Values (Easy version) (CF R 1093 Div.2 - D1) (0) | 2026.04.18 |
| Blocked (CF R 1093 - A) (0) | 2026.04.17 |
| OIE Excursion (CF R 1093 - B) (0) | 2026.04.17 |
| Grid L (CF R 1093 - A) (0) | 2026.04.16 |