index tree 어디서 틀렷나요? sims9601 #include <stdio.h> #include <vector> #include <limits.h> #define M 131072 using namespace std; int index1[2*M+30],index2[2*M+30],s[M],n,q; void update1(int a,int b){ a+=M-1; while(a!=0){ if (index1[a]<b) index1[a]=b; else break; a>>=1; } } void update2(int a,int b){ a+=M-1; while(a!=0){ if (index2[a]>b) index2[a]=b; else break; a>>=1; } } int find1(int a,int b){ a+=M-1; b+=M-1; int ma=0; while(a<=b){ if (a==b){ ma=max(ma,index1[a]); break; } if (a&1){ ma=max(ma,index1[a]); a++; } if (!(b&1)){ ma=max(ma,index1[b]); b--; } a>>=1; b>>=1; } return ma; } int find2(int a,int b){ a+=M-1; b+=M-1; int mi=INT_MAX-1; while(a<=b){ if (a==b){ mi=min(mi,index2[a]); break; } if (a&1){ mi=min(mi,index2[a]); a++; } if (!(b&1)){ mi=min(mi,index2[b]); b--; } a>>=1; b>>=1; } return mi; } int main(){ int test,t,i,a,b; scanf("%d",&test); for (t=1;t<=test;t++){ scanf("%d %d",&n,&q); for (i=0;i<2*M+2;i++) index2[i]=INT_MAX-1; for (i=1;i<=n;i++){ scanf("%d",&s[i]); update1(i,s[i]); update2(i,s[i]); } for (i=1;i<=q;i++){ scanf("%d %d",&a,&b); a++; b++; printf("%d\n",find1(a,b)-find2(a,b)); } } return 0; } 11년 전
2개의 댓글이 있습니다. Being 인덱스 계산이 잘못 된 것 같은 느낌인데요. update 쪽에서 가장 마지막으로 계산되는 인덱스가 1이니 루트가 1번인데, M - 1을 더하시면 문제가 될 것 같아 보입니다. 11년 전 link Being 그리고 다음에는 어떤 문제인지라도 간략하게 설명을 해 주시는 편이 좋겠습니다. 질문에 답변을 기다리는 것은 다른 분의 시간을 빌려 달라고 요청하는 것이기 때문에, 소스 코드만 덜렁 던져 놓으면 답변을 받을 확률이 낮아집니다. 11년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
sims9601
11년 전