2014年4月28日月曜日
Range Query - Range Minimum Query
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_A
データを更新しながらクエリに答える問題。
セグメント木で更新検索するだけです。
木の根元へ更新するとき、子のより小さい値を選びながら上へ更新していきます。
実行速度は一位タイですが皆僅差なので大差ありません。
set関数がかなり無駄というのは書き終えた後に気付きました。
#include<stdio.h>
#include<map>
#include<algorithm>
const int LIMIT=262144;
const int S=2147483647;
const int FIRST=LIMIT/2;
int A[LIMIT];
void set(int p){
if(p==0)return ;
A[p]=S;
set(p/2);
}
void dellAndSet(int y,int p){
if(p==0)return ;
int a=S,b=S;
if(p*2<LIMIT){
a=A[p*2];
}
if(p*2+1<LIMIT){
b=A[p*2+1];
}
int nowMin=std::min(std::min(y,a),b);
A[p]=nowMin;
dellAndSet(nowMin,p/2);
}
int search(int x,int y,int p,int L,int R){
if( R<x|| y<L)return S;
if(x<=L&&R<=y){
return A[p];
}else{
int a=search(x,y,p*2 ,L, (L+R)/2);
int b=search(x,y,p*2+1,(L+R)/2+1,R);
return a<b?a:b;
}
}
int main(){
int n,q,com,x,y;
scanf("%d %d",&n,&q);
for(int i=0;i<FIRST;i++){
set(FIRST+i);
}
for(int i=0;i<q;i++){
scanf("%d %d %d",&com,&x,&y);
if(com==0){
dellAndSet(y,x+FIRST);
}else{
printf("%d\n",search(x,y,1,0,FIRST-1));
}
}
}
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿