#include #include int n, m, rootN; int num[200002]={}; //특정 숫자의 개수 int now[100001]={}; //같은 숫자들의 중복의 크기를 담음 //ex 1, 2, 3, 3, 4, 5, 5, 5 now[1] = 3, now[2] = 1, now[3] = 1; int main(void) { scanf("%d %d", &n, &m); //n m 입력 int arr[n+1]; //n개의 요소들을 담을 배열 rootN = sqrt(n); //n의 제곱근 for(int i=1; i= 1; } //mo.s 알고리즘에 의해 정렬된 쿼리들을 순차적으로 실행 int s=query[0][0], e=query[0][1], is=0; //s는 start, e는 end, is는 ..
#include #include #include #include #include using namespace std; int n, m, nSqrt, cnt=1; struct Query { //쿼리를 담을 구조체 int s, e, i; bool operator < (Query &other) { //sort에서 구조체타입의 비교 연산을 위해 연산자 오버로딩, Mo.s 알고리즘 이용 int a = s/nSqrt; int b = other.s/nSqrt; if(a != b) return a < b; //1. start/N의 제곱근이 더 작은것이 우선 return e < other.e; //2. 1.의 값이 같다면 end값이 더 작은 쿼리가 우선 } }; int main(void) { map M; //좌표압축을 ..
#include #include int n, m, rootN; int num[100001]={}; //특정 숫자의 개수 int now[100001]={}; //같은 숫자들의 중복의 크기를 담음 //ex 1, 2, 3, 3, 4, 5, 5, 5 now[1] = 3, now[2] = 1, now[3] = 1; int main(void) { scanf("%d", &n); //n 입력 int arr[n+1]; //n개의 요소들을 담을 배열 rootN = sqrt(n); //n의 제곱근 for(int i=1; i= 1; } //mo.s 알고리즘에 의해 정렬된 쿼리들을 순차적으로 실행 int s=query[0][0], e=query[0][1], is=0; //s는 start, e는 end, is는 가장 많이 등장하..

#include #include #include using namespace std; int main(void) { int n, q, k; scanf("%d %d %d", &n, &q, &k); //쿼리들을 저장할 배열 v[][] 왼쪽으로는 0번쿼리를 저장, 오른쪽으로는 1,2번쿼리를 저장 int v[q][2], left = 0, right = q-1, cnt = 0; deque deq; //나중에 사용할 덱 for(int i=0; i j) { //0번쿼리(삽입) if(out) deq.push_back(v[j][0]); else deq.push_front(v[j][0]); j++; } if(v[i][0] == 1) { //1번 쿼리 sort(deq.begin(), deq.end()); //오름차순 정렬 ..
#include long long int arr[100001]={}; long long int tree[400004]={}; void update(int s, int e, int node, int index, int val) { //segment tree update if(s > index || e < index) return; tree[node] += val; if(s == e) return; int m = (s+e)/2; update(s, m, node*2, index, val); update(m+1, e, node*2+1, index, val); } long long int find(int s, int e, int node, int l, int r) { //segment tree에서 부분합 구하기 ..
#include int find(int x, int* p) { //부분집합의 대표노드 찾기 if(p[x] == x) return x; return p[x] = find(p[x], p); } void merge(int x, int y, int* p) { //부분집합 합치기 x = find(x, p); y = find(y, p); if(x!=y) p[x] = y; } int main(void) { int n, q, tmp, tmp_q; scanf("%d %d", &n, &q); tmp = n+q-1; tmp_q = q; int arr[n+1], parent[n+1], query[tmp][3], ans[tmp]; for(int i=1; i
- Total
- Today
- Yesterday
- 기하학
- 누적합
- 덱
- 정렬
- Krustal
- 최소 스패닝 트리
- 그리디
- 최대공약수
- DP
- 백준
- C언어
- Segment Tree
- 1835
- C++
- PASCAL
- 오프라인 쿼리
- 1835번
- find
- 스택
- 브루트포스
- 세그먼트 트리
- Lazy Propagation
- 플로이드
- 누적 합
- union
- DFS
- BFS
- java
- 그래프
- XOR
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |