Skip to content

Commit

Permalink
feat: 2024/10/19
Browse files Browse the repository at this point in the history
  • Loading branch information
kweonminsung committed Oct 19, 2024
1 parent f003377 commit 1bb67db
Show file tree
Hide file tree
Showing 6 changed files with 267 additions and 1 deletion.
41 changes: 41 additions & 0 deletions 1306/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#include <bits/stdc++.h>
#define MAX 1000001

using namespace std;

int N, M;
int arr[MAX], tree[4 * MAX];

int init(int start, int end, int n) {
if (start == end)
return tree[n] = arr[start];

int mid = (start + end) / 2;
return tree[n] = max(init(start, mid, 2 * n), init(mid + 1, end, 2 * n + 1));
}

int query(int start, int end, int n, int left, int right) {
if (left > end || right < start)
return 0;

if (left <= start && end <= right)
return tree[n];

int mid = (start + end) / 2;
return max(query(start, mid, 2 * n, left, right),
query(mid + 1, end, 2 * n + 1, left, right));
}

int main() {
ios::sync_with_stdio(0);
cin.tie(0);

cin >> N >> M;

for (int i = 0; i < N; i++)
cin >> arr[i];
init(0, N - 1, 1);

for (int i = M - 1; i + M - 1 < N; i++)
cout << query(0, N - 1, 1, i - M + 1, i + M - 1) << " ";
}
65 changes: 65 additions & 0 deletions 1321/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#include <bits/stdc++.h>
#define MAX 500001

using namespace std;

int N, M, a, b, c;
int arr[MAX], arrIndex[MAX], tree[4 * MAX];

int init(int start, int end, int n) {
if (start == end) {
arrIndex[start] = n;
return tree[n] = arr[start];
}

int mid = (start + end) / 2;
return tree[n] = init(start, mid, 2 * n) + init(mid + 1, end, 2 * n + 1);
}

void update(int index, int value) {
int cur = arrIndex[index];

tree[cur] = value;
while (cur != 1) {
tree[cur / 2] = tree[cur] + tree[(cur % 2 == 0) ? (cur + 1) : (cur - 1)];
cur /= 2;
}
}

int query(int start, int end, int n, int sum) {
if (start == end)
return start;

int mid = (start + end) / 2;
int ret = 0;

if (sum <= tree[2 * n])
ret = query(start, mid, 2 * n, sum);
else
ret = query(mid + 1, end, 2 * n + 1, sum - tree[2 * n]);
return ret;
}

int main() {
ios::sync_with_stdio(0);
cin.tie(0);

cin >> N;
for (int i = 0; i < N; i++)
cin >> arr[i];

init(0, N - 1, 1);

cin >> M;
for (int i = 0; i < M; i++) {
cin >> a;
if (a == 1) {
cin >> b >> c;
update(b - 1, arr[b - 1] + c);
arr[b - 1] += c;
} else {
cin >> b;
cout << query(0, N - 1, 1, b) + 1 << "\n";
}
}
}
60 changes: 60 additions & 0 deletions 1849/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#include <bits/stdc++.h>
#define MAX 100001

using namespace std;

int N, t;
int arr[MAX], arrIndex[MAX], tree[4 * MAX];

int init(int start, int end, int n) {
if (start == end) {
arrIndex[start] = n;
return tree[n] = 1;
}

int mid = (start + end) / 2;
return tree[n] = init(start, mid, 2 * n) + init(mid + 1, end, 2 * n + 1);
}

void update(int index, int value) {
int cur = arrIndex[index];

tree[cur] = value;
while (cur != 1) {
tree[cur / 2] = tree[cur] + tree[(cur % 2 == 0) ? (cur + 1) : (cur - 1)];
cur /= 2;
}
}

int query(int start, int end, int n, int sum) {
if (start == end)
return start;

int mid = (start + end) / 2;
int ret = 0;

if (sum <= tree[2 * n])
ret = query(start, mid, 2 * n, sum);
else
ret = query(mid + 1, end, 2 * n + 1, sum - tree[2 * n]);
return ret;
}

int main() {
ios::sync_with_stdio(0);
cin.tie(0);

cin >> N;

fill(tree, tree + 4 * N, 1);
init(0, N - 1, 1);

for (int i = 0; i < N; i++) {
cin >> t;
int tmp = query(0, N - 1, 1, t + 1);
update(tmp, 0);
arr[tmp] = i;
}
for (int i = 0; i < N; i++)
cout << arr[i] + 1 << "\n";
}
29 changes: 29 additions & 0 deletions 18870_1/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#include <bits/stdc++.h>

using namespace std;

int N, t;
vector<int> V;

void compress(vector<int> &A) {
vector<int> B(A);
sort(B.begin(), B.end());
// Remove Duplicates
B.erase(unique(B.begin(), B.end()), B.end());
for (int &x : A)
x = lower_bound(B.begin(), B.end(), x) - B.begin();
}

int main() {
ios::sync_with_stdio(0);
cin.tie(0);

cin >> N;
for (int i = 0; i < N; i++)
cin >> t, V.push_back(t);

compress(V);

for (auto i : V)
cout << i << " ";
}
67 changes: 67 additions & 0 deletions 2517/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include <bits/stdc++.h>
#define MAX 500001

using namespace std;

int N, t;
vector<int> V;
int arrIndex[MAX], tree[4 * MAX];

void compress(vector<int> &A) {
vector<int> B(A);
sort(B.begin(), B.end());
for (int &x : A)
x = lower_bound(B.begin(), B.end(), x) - B.begin();
}

void init(int start, int end, int n) {
if (start == end) {
arrIndex[start] = n;
return;
}

int mid = (start + end) / 2;
init(start, mid, 2 * n);
init(mid + 1, end, 2 * n + 1);
}

void update(int index, int value) {
int cur = arrIndex[index];

tree[cur] = value;
while (cur != 1) {
tree[cur / 2] = tree[cur] + tree[(cur % 2 == 0) ? (cur + 1) : (cur - 1)];
cur /= 2;
}
}

int query(int start, int end, int n, int left, int right) {
if (left > end || right < start)
return 0;

if (left <= start && end <= right)
return tree[n];

int mid = (start + end) / 2;
return query(start, mid, 2 * n, left, right) +
query(mid + 1, end, 2 * n + 1, left, right);
}

int main() {
ios::sync_with_stdio(0);
cin.tie(0);

cin >> N;
for (int i = 0; i < N; i++) {
cin >> t;
V.push_back(t);
}
compress(V);

init(0, N - 1, 1);

for (int i = 0; i < N; i++) {
update(V[i], 1);
cout << i - query(0, N - 1, 1, 0, V[i] - 1) + 1 << "\n";
}
}
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ $ ./format
<summary>정렬</summary>
<div markdown="1">

- 준비 중
- [BOJ 18870: 좌표 압축](./18870/main.cpp) / [#1](./18870_1/main.cpp)

</div>
</details>
Expand Down Expand Up @@ -185,12 +185,16 @@ $ ./format

- [BOJ 1168: 요세푸스 문제 2](./1168/main.cpp)
- [BOJ 1275: 커피숍2](./1275/main.cpp)
- [BOJ 1306: 달려라 홍준](./1306/main.cpp)
- [BOJ 1321: 군인](./1321/main.cpp)
- [BOJ 1395: 스위치](./1395/main.cpp)
- [BOJ 1517: 버블 소트](./1517/main.cpp)
- [BOJ 1849: 순열](./1849/main.cpp)
- [BOJ 2042: 구간 합 구하기](./2042/main.cpp)
- [BOJ 2243: 사탕상자](./2243/main.cpp)
- [BOJ 2268: 수들의 합 7](./2268/main.cpp)
- [BOJ 2357: 최솟값과 최댓값](./2357/main.cpp)
- [BOJ 2517: 달리기](./2517/main.cpp)
- [BOJ 3653: 영화 수집](./3653/main.cpp)
- [BOJ 9345: 디지털 비디오 디스크(DVDs)](./9345/main.cpp)
- [BOJ 10868: 최솟값](./10868/main.cpp)
Expand Down

0 comments on commit 1bb67db

Please sign in to comment.