#include int main(void) { int n,c,i,j,x,y,z,g,p=0; scanf("%d %d",&n,&c); int a[n][3]; for(i=0;i>1; while(1) { if(!(g&1)) ++g; for(i=g;i=0;j-=g) { if(z>a[j][2] || (z==a[j][2] && y>=1; } for(i=0;i 풀이 : 집합과 맵 map을 구현하려면 red-black tree을 구현해야 하나, 그정도의 실력은 되지 않으며, 자료가 별로 주어지지 않기 때문에 배열로 가짜 map을 만들었습니다.(탐색시간이 O(n)으로 비효율적입니다) 1. n,c 을 입력받습니다.2. a[n][3] 이라는 배열을 만듭니다. 0번째는 값, 1번째는 들어온 순서 index, 2번째는 ..

t = int(input())n = int(input())a = list(map(int,input().split()))a.sort()a = [abs(b-a) for a,b in zip(a,a[1:])]a.sort()print(sum(a[0:t-n])) 풀이 : 정렬1. 집의 좌표를 오름차순으로 정렬합니다 (내림차순도 상관없습니다)2. 각 집끼리의 차이를 (음의 정수가 아닌 정수로) 계산합니다. 만약 같은 좌표라면 결과는 0입니다3. 2에서 구한 차이들을 또 정렬합니다.4. 가장 큰 차이부터 (집중국의 개수 -1) 만큼 제거합니다.5. 4에서 남아있는 차이들의 합이 답입니다. 4에서 제거한다는 것은 위의 그림을 보면 새로운 집중국을 설치하는것으로 여길수 있습니다0 1 1 2 2 3 에서 (집중국 1개)0 ..
#include #include int compare(const void *a, const void *b) { //qsort 을 위한 함수 return *(int*)a - *(int*)b; //오름차순 정렬}int main(void) { int n,n1,n2,gap1,gap2,ans=0; scanf("%d",&n); //입력 n1=n-1;n2=n-2; int *a = (int *) malloc(sizeof(int)*n); //동적 할당 for(int i=0; i gap2); else if(gap1*2 풀이 : 정렬, 브루트 포스 오름차순으로 정렬을 한 다음브루트 포스로 X Y Z에서 Y와 X차이와 같거나 Y와 X차이의 2배 이하인 Z와 Y의 차이인 X Y Z의 쌍을 구했습니다. 이분탐색이나 다른..
#include #include typedef struct A{int x,y; /*x (index) y (value)*/}A;int tree[2000000] = {};int compare(const void *a, const void *b) { //value 기준 오름차순 정렬 return (*(A*)a).y - (*(A*)b).y;}int update(int s, int e, int node, int index) { if(s>index || er || e=0; i--) { ans += find(0,n-1,1,0,arr[i].x-1); update(0,n-1,1,arr[i].x); } printf("%lld",ans);} 풀이 : 세그먼트 트리,정렬 0. 세그먼트 트리를 준비합니다. 특정 index..
#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 #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 #include #include using namespace std; int arr[100001]; vector tree[400001]; void update(int s, int e, int node, int index, int val) { //merge sort tree 수정 if(s > index || e < index) return; tree[node].push_back(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); } int find(int s, int e, int node, int l, int r, int key) { //m..

import java.util.Scanner; public class Main { public static void main(String[] args) { int n, m; Scanner scan = new Scanner(System.in); n = scan.nextInt(); //배열의 요소의 개수 int[] sort = new int[n]; //배열 생성 for(int i=0; i>= 1; } int left=1, right=0, ans=0, flag = 0; //좋은 구간의 왼쪽값, 오른쪽 값, 범위의 개수, 오른쪽값의 갱신여부 if(sort[n-1] < m) ans = -1; //만약 입력 받은 수 보다 특별한 수가 for(i=0; i= 0 && right != 0) { //좋은 구간 구하기 an..
- Total
- Today
- Yesterday
- XOR
- Lazy Propagation
- 그리디
- C언어
- 그래프
- Segment Tree
- 누적합
- DP
- Krustal
- java
- 1835
- DFS
- 스택
- C++
- 누적 합
- 최대공약수
- 오프라인 쿼리
- 기하학
- 백준
- 플로이드
- 1835번
- 세그먼트 트리
- 덱
- 브루트포스
- 최소 스패닝 트리
- BFS
- 정렬
- union
- PASCAL
- find
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |