More actions
No edit summary |
(Repair pages found by live-compare batch 0001) |
||
| 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 186: | Line 186: | ||
using namespace std; | using namespace std; | ||
int arr | int arr[32][1001] = {0,}; | ||
int ina | int ina[1001] = {0,}; | ||
int main(){ | int main(){ | ||
int n, m; | int n, m; | ||
cin>>n>>m; | cin>>n>>m; | ||
for(int i = 1; i<=n; i++){ | for(int i = 1; i<=n; i++){ | ||
scanf("%d", &ina | scanf("%d", &ina[i]); | ||
} | } | ||
int place = 1; | int place = 1; | ||
for(int i = 1; i<=m+1; i++){ | for(int i = 1; i<=m+1; i++){ | ||
for(int j = 1; j<=n; j++){ | for(int j = 1; j<=n; j++){ | ||
int tmp = arr | int tmp = arr[i][j-1]; | ||
if(ina | if(ina[j] == place){ | ||
tmp++; | tmp++; | ||
} | } | ||
arr | arr[i][j] = max(tmp, arr[i-1][j]); | ||
} | } | ||
if(i%2){ | if(i%2){ | ||
| Line 211: | Line 211: | ||
} | } | ||
cout<<arr | cout<<arr[m+1][n]; | ||
} | } | ||
| Line 225: | Line 225: | ||
== 곽정흠 == | == 곽정흠 == | ||
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로 풀었습니다.(냅색을 약간 응용했습니다.)