(1) : 원소들의 끝자리가 0또는 5인 경우 : 5인 애들에 연산 한 번 써서 다 0으로 맞추고 모두 동일한지 확인.
(2) : 원소들의 끝자리가 0도 아니고 5도 아닌 경우 : 항상 사이클이 발생하고 주기가 20이기 때문에
적당히 끝자리 전부 2로 맞추고 원소끼리 차이값 20의 배수인지 확인
(3) : (1)과 (2)가 공존하면 불가능
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef pair<ll,ll> pi;
- int arr[200005];
- void solve(){
- int n; cin>>n;
- bool A = 0,B = 0;
- for(int i=1; i<=n; i++){
- cin>>arr[i];
- if(arr[i]%10 == 0 || arr[i]%10 == 5) A = 1;
- else B = 1;
- }
- if(A&B) cout<<"NO"<<'\n';
- else{
- if(A){
- for(int i=1; i<=n; i++){
- while(arr[i]%10) arr[i]+=arr[i]%10;
- if(arr[i]!=arr[1]){
- cout<<"NO"<<'\n';
- return;
- }
- }
- }
- if(B){
- for(int i=1; i<=n; i++){
- while(arr[i]%10 != 2) arr[i]+=arr[i]%10;
- if((arr[i]-arr[1])%20){
- cout<<"NO"<<'\n';
- return;
- }
- }
- }
- cout<<"YES"<<'\n';
- }
- }
- int main(){
- ios_base::sync_with_stdio(false); cin.tie(NULL);
- int t; cin>>t;
- while(t--) solve();
- }
저 혹시 d번도 가능합니까?
d는 그냥 완탐 그리디라 이전까지 i번 위치까지 색칠했다고 하면 [1,i]에 속한 위치들에 모든 문자열 붙여보면서 지금까지 색칠한 prefix의 길이를 한 번에 최대한 길게 늘려주면 됨. 범위가 커지면 dp랑 kmp나 해시 써야되는데 걍 완탐으로 됨.
ㄱㅅㄱㅅ 근데 코드 되게 읽기 좋게 짜시네 저같은 개초보가 친추 하고 싶은 스타일
콘테중엔 대충 꾸겨넣고 끝나고 풀이 정리해서 짠거에요 ㅋㅋ