#include #include typedef struct A{int x,y;}A; //x index, y power (입력값을 저장할 구조체)int tree[2000000] = {}; //segment tree (n의 최댓값 50만 * 4)int compare(const void *a, const void *b) { //qsort, 오름차순 정렬, 구조체 y값 기준 return (*(A*)a).y - (*(A*)b).y;//왼쪽이 더 크면 +, 오른쪽이 더 크면 -, 같다면 0}int find(int s, int e, int node, int l, int r) { //segment tree 탐색 if(s > r || e e) return; tree[node] += dif; if(s==e) return..
#include int tree[4000004] = {};int find(int s, int e, int node, int cnt) { if(s==e) return s; int mid = (s+e)/2; if(tree[node*2]>=cnt) find(s, mid, node*2, cnt); else find(mid+1, e, node*2+1, cnt-tree[node*2]);}void update(int s, int e, int node, int index, int dif) { if(index e) return; tree[node] += dif; if(s==e) return; int mid = (s+e)/2; update(s, mid, node*2, index, dif); update(mid+1, e,..

#include //전처리된 치환 함수들#define swap(a,b) {int tmp=a; a=b; b=tmp;}#define swapR(a,b,c,d) {int tmp=a;a=d;d=c;c=b;b=tmp;}#define swapL(a,b,c,d) {int tmp=a;a=b;b=c;c=d;d=tmp;}//0 1//3 2//ro : 0,1,2,3 clock //부분배열의 상태 //vertical : default 0 (1)//horizon : default 0 (1)//pos 특정 index 자리에 처음 배열의 어떤 부분이 있는가? int main(void) { //입력 int n,m,r,t; scanf("%d %d %d",&n,&m,&r); int arr[n][m],brr[n][m]; for(int..

#include int ii,ij,oi,oj,ptr,ri,rj,l,cnt,od,id;void f0(void) { //입력 배열 회전 if(id==0) {++ii;if(ii >= ri) ii = ri, id=1;} else if(id==1) {++ij;if(ij >= rj) ij = rj, id=2;} else if(id==2) {--ii;if(ii = ri) oi=ri, od=1;} else if(od==1) {++oj;if(oj >= rj) oj=rj, od=2;} else if(od==2) {--oi;if(oi (1) 배열을 차례차례 바깥 부터 회전 시킵니다.이 때 회전 시켜야 할 부분 배열의 개수는 min(행, 열) / 2 입니다. (2) k번 회전이나, 부분 배열의 개수보다 더 많이 회전하는 것..
var n : int64;beginread(n);n := n mod 5;if (n=0) or (n=2) then write('CY')else write('SK');end. SK, CY1 : SK2 : 1-1 CY3 : 1-1-1 SK4 : 4 SK5 : 1-4, 4-1 CY6 : 4-1-1 SK7 : 1-4-1-1 CY8 : 1-1-4-1-1... SK9 : SK10 : CY11 : SK12 : 4-1-1-1-4 CY13 : ....16 : SK17 : 4-1-(12) CY18 : 1-4-4-1-(8) SK 위의 결과를 보면5로 나누었을 때 나머지가 1,2,3,4,0 일 때1,3,4 인 경우 SK 가 이기며2,0 인 경우 CY가 이깁니다.
#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 #define ll long long ll U(ll a, ll b) { ll r = a%b; return (r) ? U(b, r) : b; } int main(void) { ll n, b, X=0, Y=0, sign = -1; scanf("%lld %lld",&n, &b); for(int i=0; i a = -Y/X 입니다. 여기서 계산을 용이하기 위해 부호가 양인지 음인지를 나타내는 변수 하나를 만든다음 sign = -1 을 기본으로 해줍니다 여기서 -1을 기본으로 하는 이유는 a = -Y/X 에서 -을 sign에 넣어준 것 입니다. Y / X 계산에서 X, Y 둘 다 양수이어야 계산이 용이하므로, 음수인 경우 양수로 바꾸어 줍니다. 물론 sign의 값도 변경해주어야 합니다 (양이면 음..
#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..
- Total
- Today
- Yesterday
- 백준
- 1835
- 1835번
- 오프라인 쿼리
- 누적 합
- DFS
- 브루트포스
- 정렬
- 그래프
- C언어
- DP
- Segment Tree
- java
- 그리디
- BFS
- 덱
- PASCAL
- find
- XOR
- union
- C++
- 플로이드
- 최소 스패닝 트리
- 최대공약수
- Krustal
- 세그먼트 트리
- 기하학
- 스택
- 누적합
- Lazy Propagation
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |