https://www.acmicpc.net/problem/26434 happy subsequence개수를 구하는 문제로 잘못봤다. 그때 풀이는 f(i,j)=[0,i]에서 j이상으로 끝나는거 개수 =f(i-1,j)+f(i-1,j-a_i) 이다. 적당히 괜찮은 문제인듯 https://atcoder.jp/contests/arc145/tasks/arc145_b 이거 1~N까지 수가 있어서, 선공은 A의 배수를 가져갈 수있고, 후공은 B의 배수를 가져갈 수 있을때의 문제로 봤다. 그러면 선공은 첫 턴에 lcm(A,B)의 배수를 전부 가져가는게 항상 최선이다. 그리고 남은 승리는 (A의 배수 - lcm(), B의 배수 - lcm()) 이것의 대소관계로 승패가 결정된다. 같은경우, A가 승리한다. lcm은 대소관계에 영향을 안주니까 대충 잘 풀수 있을거같다. 근데 너무 쉬운가? https://codeforces.com/contest/1839/problem/B 이거 깨지는거 없으면 PQ로 slope trick스러운 풀이 가능한듯? 잘못읽어서... 2023 SCPC 예선1차 3번문제 잘못읽어서 오버킬했는데 문제로 낼 가능성 있을듯?? 각 a[i]>1인 것들이 반시계방향으로 회전하면서 배열을 채우는건 풀이가 거의 똑같긴 한데, stack없이 a[i]>1인것들을 반시계 최근접0에다 그냥 박아서 풀어도 된다. 근데, 그 방식으로 a를 처리해주면 실제 시뮬레이션했을때 0에 채우는 a[i]>1과 처리과정의 a[i]>1이 다를 수 있다. 그래서 실제 시뮬레이션했을때 0에 채워주는 a[i]>1정보도 알아야 풀 수 있는 문제를 만들 수 있을것 같다. N명의 사람이 원형으로 연결되어 시계방향으로 움직이고 있다. 처음엔 구역i에 번호i인 사람이 위치해있는 상태로 시작한다. 각 구역i에는 식량이 b[i](>=0)개 존재한다. 배고픈 사람은 식량이 존재하는 구역에서 밥을 먹고, 안배고픈 사람은 그냥 지나친다. 각 사람들이 배고픈지 아닌지 여부가 a[i]로 주어진다. 사람들 1~N에 대해 어느위치에서 밥을 먹는지 출력하라. 배고프지 않거나 배고프더라도 밥을 먹을수 없는 사람은 -1을 출력하면 된다. #include "core/base.h" signed main(){ void solve(); for(int ti=1,t=input1();ti<=t;ti++) println("Case #",ti), solve(); for(char c;(c=cin.get())!=EOF;) assert(c==' '||c=='\n'); } #include "str/match.h" void solve(){ auto [n]=input(); auto a=input(Arr>(n)); if(reduce(a.begin(),a.end())>=n){ println(1); return; } stack z; for(int i=n-1;i>=-n;i--){ if(a[i]>1) z.push(i); else if(a[i]==0){ while(sz(z) and a[z.top()]<=1) z.pop(); if(sz(z)){ a[i]++; a[z.top()]--; } } } dbg(a); auto aa=a; aa.insert(aa.end(),a.begin(),a.end()); auto len=z_match(aa,a); int ans=1; while(len[ans]= idx a[x_1] + ... + a[x_k-1] >= x_k ... a[x_1] >= x_2 x_1 = 0 이라는 부등식 제약조건들로 표현된다. 인접한 두 식끼리 빼면 difference constrained linear equation 꼴이라서 최단경로문제의 선형계획법 표현이 된다. 근데, 어떤 노드 x까지 갔을때 어디까지 열려있는지를 몰라서 (d[x]인줄 알았는데 d[x]보다 더 많은게 열려있을 수 있) 또 다시 잘못읽어서 만들어진 문제 https://codeforces.com/contest/1877/problem/D 문제에선 최댓값의 합인데, 합의 합으로 봐서 기여도 어쩌구 하는걸 계산해서 품. 난이도는 코포원본보다 쉽긴 한듯. #include "math/sieve.h" #include "math/struct/mod.h" using M=Mod<>; void solve(){ int n=input1(); auto a=input(ARR(n,0ll)); auto d=sieve_divs(100000); M ans=0; for(int i=0;i