티스토리 뷰
Codeforces에서 열렸던 Avito 대회에서 나온 D랑 비트 크기 55로 바꾸고, Bitwise OR 연산에서 AND 연산으로 바꾸기만 하면 완전히 동치이다.
참고로 역대 APIO 문제들 중에서 가장 쉬웠던 문제들 중 하나라고 한다.... 난이도 실화?
https://oj.uz/problem/view/APIO15_sculpture
코드포스 D문제는 맨 끝에 올려놓을테니 완전히 이해되면 한번 풀어보길 바란다.
문제 요약
풀이
A=1
(단, (partsum[i]-partsum[j])|val == val를 만족하는 j의 값)
여기서 val은 현재까지 누적된 최소의 Bitwise OR 값에서 T번쨰의 비트가 꺼진 값이다.
partsum은 부분합을 저장해놓은 배열이고, 두개의 차이와 val의 Bitwise OR값이 val이란 것과 동일하다의 의미는 partsum[i]-partsum[j]에서 현재 비트 T를 가지고 있지 않다를 의미한다. 따라서, 조각상을 분해할 수 있는 것이다.
이 dp에서 i를 1부터 n까지 돌려준다. 다 돌리고 나서, dp[n]값을 봤을 때 K보다 작거나 같으면 없어도 되므로 꺼주고, 그 외에는 켜준다.
시간복잡도는 이고, N이 2000보다 작으므로 1초 씹어먹고 남는다.
이를 바탕으로 A가 1이 아닐때로 확장해보자
A !=1
val의 정의는 앞과 동일하다.
이 dp를 j는 K까지, 그리고 j까지 돌려준 반복문을 i를 기반으로 해서 N까지 돌려준다.
다 돌리고 난 후에, dp[N][A]에서 dp[N][B]까지 돌려보면서 만약 하나라도 true가 되면 분할할 수 있다는 것이므로 꺼주고, 그 외에는 켜준다.
시간복잡도는 이고, K는 최대 N이기 때문에 최악일때의 시간 복잡도는
이다. 이것도 씹어먹음
이렇게 해서 비트값을 관리해주고, 마지막엔 비트값이 켜져있으면 더해주고 꺼져있으면 지나가면 된다.
답이 int범위를 넘어갈 수도 있기 때문에, 혹시나 모르니 long long으로 선언하고 하자. 정신건강에 해롭지 않기 위해...^^
코드포스 D도 내가보기엔 소스 코드 4줄~5줄 정도 바꾸면 바로 AC이다. 어제 어디선가 많이 풀어봤는데... 하면서 대회하다가 끝나자마자 앗 발리~~~ 인생;;; 하면서 땅을 치고 후회했던 기억이 있다.
소스
참고
'알고리즘' 카테고리의 다른 글
LCA(Lowest Common Ancestor) (0) | 2018.05.29 |
---|---|
문제 풀이 의식적 흐름( IOI 2014, Game ) - 도전중 (0) | 2018.05.28 |
JOI 2018 Tents (0) | 2018.05.28 |
문제 풀이 의식의 흐름 ( JOI 18, Worst reporter ) (3) | 2018.05.27 |
시간복잡도-1 (0) | 2017.08.11 |
- Total
- Today
- Yesterday
- JOI 2021
- 해석학 Ch5
- mathematics
- 17411
- 로피탈
- Trace trick
- 백준
- 연습문제
- Differentation
- 선형대수학
- Backprop
- LInear SVM
- 해석학 Chapter 5
- Deep learning
- icpc.me/17411
- PMA
- 미분
- 세그먼트 트리
- cs231n assignment1
- 수학
- 해석학II
- 백준 17411
- 수(상)
- joi
- PMA 연습문제
- Derivate
- Trace tirck
- PMA Ch5
- 해석학
- Machine Learning
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |