More actions
({CREATE}) |
(Repair pages found by live-compare batch 0001) |
||
| (4 intermediate revisions by one other user not shown) | |||
| Line 4: | Line 4: | ||
* [https://www.acmicpc.net/problem/11659|구간 합 구하기 4] | * [https://www.acmicpc.net/problem/11659|구간 합 구하기 4] | ||
* [https://www.acmicpc.net/problem/2042|구간 합 구하기] | * [https://www.acmicpc.net/problem/2042|구간 합 구하기] | ||
* [https://www.acmicpc.net/problem/2240|자두나무] | |||
= 참가자 = | = 참가자 = | ||
* 15이원준 | * 15이원준 | ||
| Line 15: | Line 15: | ||
using namespace std; | using namespace std; | ||
long long int arr | long long int arr[4000000] = { 0, }; | ||
int start = 1; | int start = 1; | ||
| Line 22: | Line 22: | ||
int p = (n-1) / 2; | int p = (n-1) / 2; | ||
if(n%2){ | if(n%2){ | ||
arr | arr[p] = arr[n] + arr[(p+1)*2]; | ||
} | } | ||
else{ | else{ | ||
arr | arr[p] = arr[n] + arr[(p+1)*2 - 1]; | ||
} | } | ||
n = p; | n = p; | ||
| Line 32: | Line 32: | ||
long long int initSort(int n){ | long long int initSort(int n){ | ||
if(n >= start){ | if(n >= start){ | ||
return arr | return arr[n]; | ||
} | } | ||
if(arr | if(arr[n]){ | ||
if(arr | if(arr[n] == -1){ | ||
return 0; | return 0; | ||
} | } | ||
return arr | return arr[n]; | ||
} | } | ||
long long int tmp1 = initSort((n+1)*2); | long long int tmp1 = initSort((n+1)*2); | ||
| Line 44: | Line 44: | ||
long long int tmp = tmp1 + tmp2; | long long int tmp = tmp1 + tmp2; | ||
if(tmp == 0){ | if(tmp == 0){ | ||
arr | arr[n] = -1; | ||
return 0; | return 0; | ||
} | } | ||
return arr | return arr[n] = tmp; | ||
} | } | ||
long long int sum(int s, int e){ | long long int sum(int s, int e){ | ||
| Line 56: | Line 56: | ||
} | } | ||
else{ | else{ | ||
ans += arr | ans += arr[s]; | ||
s = s/2; | s = s/2; | ||
} | } | ||
if(e%2){ | if(e%2){ | ||
ans += arr | ans += arr[e]; | ||
e = (e-2)/2; | e = (e-2)/2; | ||
} | } | ||
| Line 68: | Line 68: | ||
} | } | ||
if(s == e){ | if(s == e){ | ||
ans += arr | ans += arr[s]; | ||
} | } | ||
return ans; | return ans; | ||
| Line 82: | Line 82: | ||
start -= 1; | start -= 1; | ||
for(int i = 0; i<n; i++){ | for(int i = 0; i<n; i++){ | ||
scanf("%d",&arr | scanf("%d",&arr[start + i]); | ||
} | } | ||
initSort(0); | initSort(0); | ||
| Line 97: | Line 97: | ||
using namespace std; | using namespace std; | ||
long long int arr | long long int arr[4000000] = { 0, }; | ||
int start = 1; | int start = 1; | ||
| Line 104: | Line 104: | ||
int p = (n-1) / 2; | int p = (n-1) / 2; | ||
if(n%2){ | if(n%2){ | ||
arr | arr[p] = arr[n] + arr[n+1]; | ||
} | } | ||
else{ | else{ | ||
arr | arr[p] = arr[n] + arr[n-1]; | ||
} | } | ||
n = p; | n = p; | ||
| Line 114: | Line 114: | ||
long long int initSort(int n){ | long long int initSort(int n){ | ||
if(n >= start){ | if(n >= start){ | ||
return arr | return arr[n]; | ||
} | } | ||
if(arr | if(arr[n]){ | ||
if(arr | if(arr[n] == -1){ | ||
return 0; | return 0; | ||
} | } | ||
return arr | return arr[n]; | ||
} | } | ||
long long int tmp1 = initSort((n+1)*2); | long long int tmp1 = initSort((n+1)*2); | ||
| Line 126: | Line 126: | ||
long long int tmp = tmp1 + tmp2; | long long int tmp = tmp1 + tmp2; | ||
if(tmp == 0){ | if(tmp == 0){ | ||
arr | arr[n] = -1; | ||
return 0; | return 0; | ||
} | } | ||
return arr | return arr[n] = tmp; | ||
} | } | ||
long long int sum(int s, int e){ | long long int sum(int s, int e){ | ||
| Line 138: | Line 138: | ||
} | } | ||
else{ | else{ | ||
ans += arr | ans += arr[s]; | ||
s = s/2; | s = s/2; | ||
} | } | ||
if(e%2){ | if(e%2){ | ||
ans += arr | ans += arr[e]; | ||
e = (e-2)/2; | e = (e-2)/2; | ||
} | } | ||
| Line 150: | Line 150: | ||
} | } | ||
if(s == e){ | if(s == e){ | ||
ans += arr | ans += arr[s]; | ||
} | } | ||
return ans; | return ans; | ||
| Line 163: | Line 163: | ||
start -= 1; | start -= 1; | ||
for(int i = 0; i<n; i++){ | for(int i = 0; i<n; i++){ | ||
scanf("%d",&arr | scanf("%d",&arr[start + i]); | ||
} | } | ||
initSort(0); | initSort(0); | ||
| Line 171: | Line 171: | ||
scanf("%d %d %d", &tmp1, &tmp2, &tmp3); | scanf("%d %d %d", &tmp1, &tmp2, &tmp3); | ||
if(tmp1 == 1){ | if(tmp1 == 1){ | ||
arr | arr[start + tmp2 -1] = tmp3; | ||
sort(start + tmp2 -1); | sort(start + tmp2 -1); | ||
} | } | ||
| Line 180: | Line 180: | ||
} | } | ||
=== 자두나무 === | |||
#include<iostream> | |||
#include<algorithm> | |||
using namespace std; | |||
int arr[32][1001] = {0,}; | |||
int ina[1001] = {0,}; | |||
int main(){ | |||
int n, m; | |||
cin>>n>>m; | |||
for(int i = 1; i<=n; i++){ | |||
scanf("%d", &ina[i]); | |||
} | |||
int place = 1; | |||
for(int i = 1; i<=m+1; i++){ | |||
for(int j = 1; j<=n; j++){ | |||
int tmp = arr[i][j-1]; | |||
if(ina[j] == place){ | |||
tmp++; | |||
} | |||
arr[i][j] = max(tmp, arr[i-1][j]); | |||
} | |||
if(i%2){ | |||
place = 2; | |||
} | |||
else{ | |||
place = 1; | |||
} | |||
} | |||
cout<<arr[m+1][n]; | |||
} | |||
== 박인서 == | == 박인서 == | ||
| Line 186: | Line 220: | ||
= 아이디어 = | = 아이디어 = | ||
== 15이원준 == | == 15이원준 == | ||
* 구간합은 Binary Indexed Tree를 사용했습니다. | |||
* 자두나무는 dp로 풀었습니다.(냅색을 약간 응용했습니다.) | |||
== 박인서 == | == 박인서 == | ||
== 곽정흠 == | == 곽정흠 == | ||
Latest revision as of 14:46, 26 March 2026
오늘의 문제
참가자
- 15이원준
코드
15이원준
구간 합 구하기 4
#include<iostream>
using namespace std;
long long int arr[4000000] = { 0, };
int start = 1;
int sort(int n){
while(n){
int p = (n-1) / 2;
if(n%2){
arr[p] = arr[n] + arr[(p+1)*2];
}
else{
arr[p] = arr[n] + arr[(p+1)*2 - 1];
}
n = p;
}
}
long long int initSort(int n){
if(n >= start){
return arr[n];
}
if(arr[n]){
if(arr[n] == -1){
return 0;
}
return arr[n];
}
long long int tmp1 = initSort((n+1)*2);
long long int tmp2 = initSort((n+1)*2 -1);
long long int tmp = tmp1 + tmp2;
if(tmp == 0){
arr[n] = -1;
return 0;
}
return arr[n] = tmp;
}
long long int sum(int s, int e){
long long int ans = 0;
while(s < e){
if(s%2){
s = (s-1)/2;
}
else{
ans += arr[s];
s = s/2;
}
if(e%2){
ans += arr[e];
e = (e-2)/2;
}
else{
e = (e-1)/2;
}
}
if(s == e){
ans += arr[s];
}
return ans;
}
int main(){
int n,m,k;
cin>>n>>m;
while(n > start){
start *= 2;
}
start -= 1;
for(int i = 0; i<n; i++){
scanf("%d",&arr[start + i]);
}
initSort(0);
for(int i = 0; i< m; i++){
int tmp1, tmp2;
scanf("%d %d", &tmp1, &tmp2);
printf("%lld\n", sum(start-1 + tmp1, start-1+tmp2));
}
}
구간 합 구하기
#include<iostream>
using namespace std;
long long int arr[4000000] = { 0, };
int start = 1;
void sort(int n){
while(n){
int p = (n-1) / 2;
if(n%2){
arr[p] = arr[n] + arr[n+1];
}
else{
arr[p] = arr[n] + arr[n-1];
}
n = p;
}
}
long long int initSort(int n){
if(n >= start){
return arr[n];
}
if(arr[n]){
if(arr[n] == -1){
return 0;
}
return arr[n];
}
long long int tmp1 = initSort((n+1)*2);
long long int tmp2 = initSort((n+1)*2 -1);
long long int tmp = tmp1 + tmp2;
if(tmp == 0){
arr[n] = -1;
return 0;
}
return arr[n] = tmp;
}
long long int sum(int s, int e){
long long int ans = 0;
while(s < e){
if(s%2){
s = (s-1)/2;
}
else{
ans += arr[s];
s = s/2;
}
if(e%2){
ans += arr[e];
e = (e-2)/2;
}
else{
e = (e-1)/2;
}
}
if(s == e){
ans += arr[s];
}
return ans;
}
int main(){
int n,m,k;
cin>>n>>m>>k;
while(n > start){
start *= 2;
}
start -= 1;
for(int i = 0; i<n; i++){
scanf("%d",&arr[start + i]);
}
initSort(0);
for(int i = 0; i< m+k; i++){
int tmp1, tmp2, tmp3;
scanf("%d %d %d", &tmp1, &tmp2, &tmp3);
if(tmp1 == 1){
arr[start + tmp2 -1] = tmp3;
sort(start + tmp2 -1);
}
else{
printf("%lld\n", sum(start-1 + tmp2, start-1+tmp3));
}
}
}
자두나무
#include<iostream>
#include<algorithm>
using namespace std;
int arr[32][1001] = {0,};
int ina[1001] = {0,};
int main(){
int n, m;
cin>>n>>m;
for(int i = 1; i<=n; i++){
scanf("%d", &ina[i]);
}
int place = 1;
for(int i = 1; i<=m+1; i++){
for(int j = 1; j<=n; j++){
int tmp = arr[i][j-1];
if(ina[j] == place){
tmp++;
}
arr[i][j] = max(tmp, arr[i-1][j]);
}
if(i%2){
place = 2;
}
else{
place = 1;
}
}
cout<<arr[m+1][n];
}
박인서
곽정흠
아이디어
15이원준
- 구간합은 Binary Indexed Tree를 사용했습니다.
- 자두나무는 dp로 풀었습니다.(냅색을 약간 응용했습니다.)