Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준 10819
- Coroutine Flow
- 6588 파이썬
- android hilt
- 5582 파이썬
- 10819 파이썬
- 1753 파이썬
- 자료구조
- git local remote
- 1806 파이썬
- 2096 파이썬
- 안드로이드 hilt
- Jetpack Room
- 1806 백준
- 백준 5582
- 1644 파이썬
- Android Room
- 이진 탐색
- 1753 다익스트라
- 자바
- 1003 파이썬
- Android mvp
- 5582 DP
- 1806 투포인터
- 백준 2096
- 코루틴 플로우
- 투포인터 알고리즘
- java
- 백준 1644
- flow buffering
Archives
- Today
- Total
Gemstone's Devlog
[Codeforces] 768B: Code For 1 본문
https://codeforces.com/problemset/problem/768/B
이 문제는 쉽게 말하면 자연수 n을 받으면 n으로 비트열을 만드는 문제이다.
(x mod 2 : x를 2로 나눈 나머지)
문자열을 다 구할 수는 없다. n이 2의 50승까지 가능하기때문에.
희한한 방법으로 풀어야한다.
n, l, r이 주어졌을 때 재귀로 풀어낼 것이다.
C++ 코드
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
long long solve(long long n, long long l, long long r) {
long long temp, len, mid;
temp = n / 2;
len = 1;
while (temp > 0) {
len = len*2 + 1;
temp /= 2;
}
// 전부일 경우
if (l == 1 && r == len)
return n;
// 중간 포인트
mid = (len+1)/2;
if (l > mid) return solve(n/2, l - mid, r - mid);
if (r < mid) return solve(n/2, l, r);
if (l == mid && r == mid) return n % 2;
if (l == mid) return solve(n/2, 1, r - mid) + n % 2;
if (r == mid) return solve(n/2 , l, mid - 1) + n % 2;
return solve(n/2, l, mid-1) + solve(n/2, 1, r - mid) + n % 2;
}
int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
long long n, l, r;
cin >> n >> l >> r;
cout << solve(n, l, r);
return 0;
}
'Data Structure & Algorithms' 카테고리의 다른 글
[백준] 1992번: 쿼드트리 (분할정복) (0) | 2022.03.28 |
---|---|
[백준] 2133번: 타일 채우기 (다이나믹 프로그래밍) (0) | 2022.03.28 |
[Codeforces] 448C: Painting Fence (0) | 2022.03.27 |
[백준] 1202번: 보석 도둑 (우선순위 큐) (0) | 2022.03.27 |
[백준] 1339번: 단어 수학 (그리디) (0) | 2022.03.24 |