#include int f(int *a) { int b = *a%4; if(b==0) b=*a; else if(b==1) b=1; else if(b==2) b=*a+1; else if(b==3) b=0; return b; } int main(void) { int n; scanf("%d",&n); while(n--) { int a, b; scanf("%d %d", &a, &b); --a; printf("%d\n", f(&b)^f(&a)); } } XOR의 성질을 이용하는 문제입니다. 1. 1부터 연속적으로 XOR을 하면 0001 0001 ... 1 0002 0003 ... 3 = 2 + 1 0003 0000 ... 0 0004 0004 ... 4 0005 0001 ... 1 0006 0007 ... 7 =..
#include int U(int a, int b) { //유클리드 (최대공약수) int r = a%b; if(r) U(b, r); else return b; } int main(void) { int n, a, b; scanf("%d %d",&n, &a); for(int i=0; i0) { b = U(b, tmp); } else b = tmp; } printf("%d", b); } https://www.acmicpc.net/problem/17087 17087번: 숨바꼭질 6 수빈이는 동생 N명과 숨바꼭질을 하고 있다. 수빈이는 현재 점 S에 있고, 동생은 A1, A2, ..., AN에 있다. 수빈이는 걸어서 이동을 할 수 있다. 수빈이의 위치가 X일때 걷는다면 1초 후에 X+D나 X-D로 이 www.ac..
#include #include #define MAX 10001 using namespace std; vector vec[MAX]; vector v; int ans, index; //ans : 트리에서 가장 긴 간선들의 합, index : 처음 DFS을 돌려서, 임의의 점 중 가장 먼 곳에 있는 점의 인덱스 void DFS(int root, int dis) { v[root] = true; if(dis > ans) { //이전의 가장 긴 거리보다 더 크다면, ans와 index을 갱신한다. ans = dis; index = root; } for(pairx : vec[root]) { //연결된 간선들 중 if(!v[x.first]) { //방문하지 않은 것만 DFS(x.first, x.second + dis..
#include #define Q q.front() using namespace std; int n, m, ans = 1e9, blank = 0; int Map[50][50] = {}; vector virus; vector vec; int V[4] = {-1, 0, 1, 0}, H[4] = {0, 1, 0, -1}; void BFS() { queue q; //큐 int tmp = 0, cnt = 0; //tmp는 탐색 level, cnt는 0을 채운 개수 bool v[n][n]; //방문 확인 memset(v, false, sizeof(bool)*n*n); //초기화 for(pair i : vec) { //활성화 할 바이러스들을 큐에 삽입 및, 방문 처리 int x = i.first; int y = i...
#include #define Q q.front() using namespace std; int V[4] = {-1, 0, 1, 0}; int H[4] = {0, 1, 0, -1}; int n, m, zero = -3; //벽 3개를 무조건 설치하므로 -3으로 시작합니다. int Max = 0; int Map[8][8] = {}; vector two; void bfs(void) { //bfs queue q; //큐 int cnt = zero; //벽 3개를 설치한 이후 0의 개수 bool v[n][m]; //방문 확인 배열 memset(v, false, sizeof(bool)*n*m); //방문 확인 for(pair i : two) q.push({i.first, i.second}); //바이러스인 곳을 ..
#include #define Q q.front() using namespace std; int main(void) { ios::sync_with_stdio(0); cin.tie(0); int n, m, a, b, c; //a, b, c는 입력을 위한 변수 cin >> n >> m; vector vec[n+1]; //간선의 정보를 담을 벡터 queue q; //BFS에서 사용할 큐 for(int i=1; i> a >> b >> c; vec[a].push_back({b, c}); vec[b].push_back({a, c}); } for(int i=0; i> a >> b; q.push({a, 0}); //큐에 시작노드와 가중치를 0 으로 넣음 v[a] = true; while(!q.empty()) { //B..
#include using namespace std; int main(void) { ios::sync_with_stdio(0); cin.tie(0); int s, ans = 1e9; cin >> s; queue q; q.push(make_tuple(1, 1, 1)); bool v[1001] = {}; //방문확인 while(!q.empty()) { //bfs int now = get(q.front()); int copy = get(q.front()); int value = get(q.front()); q.pop(); if(now == s) { //원하는 개수로 맞추었다면 탐색 종료 ans = value; break; } value++; //수행시간 1 증가 if(now 2) q.push(make_tupl..
#include using namespace std; int main(void) { ios::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while(t--) { int a, b; queue q; cin >> a >> b; q.push(make_tuple(a, b, 0)); while(!q.empty()) { int x = get(q.front()); int y = get(q.front()); int v = get(q.front()); q.pop(); x *= 2; y += 3; v++; if(x < y) q.push(make_tuple(x, y, v)); else if(x==y) { cout
#include using namespace std; int main(void) { ios::sync_with_stdio(0); cin.tie(0); int a, b, n, m, x, y; cin >> a >> b; //출발, 도착 cin >> n >> m; //개수, 쿼리의 개수 vector vec[n+1]; //간선을 저장할 벡터들 bool v[n]; //방문을 확인할 배열 memset(v, false, n * sizeof(bool)); //방문을 확인할 배열을 0으로 초기화 합니다. while(m--) { //간선을 벡터에 저장합니다. cin >> x >> y; vec[x].emplace_back(y); vec[y].emplace_back(x); } if(a == b) { //출발과 도착이 같은 경..
- Total
- Today
- Yesterday
- 1835
- 최대공약수
- 정렬
- 오프라인 쿼리
- 카드
- 트리
- 16120번
- 그리디
- union
- 백준
- 스택
- 누적합
- 그래프
- DFS
- Krustal
- C++
- 플로이드
- java
- DP
- 최소 스패닝 트리
- Mo.s
- 6198번
- C언어
- 누적 합
- 6198
- 세그먼트 트리
- find
- BFS
- 1835번
- 덱
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |