■B. Revenge of the Hot Dogs
ご想像のとおり二分探索.時間tに対して,各ホットドッグ屋がD離れることが出来るかを判定する必要がある.
これは,ホットドッグ屋を左から見ていき,可能な限り左に寄せていくことで判定できる.
二分探索の上限の見積もりが甘くLargeでWAってしまった….
import java.util.*; import java.util.Map.Entry; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class B{ Scanner sc=new Scanner(System.in); long INF=1L<<40; double EPS=1e-9; int caze; int n, d; R[] rs; void run(){ int tt=sc.nextInt(); for(caze=1; caze<=tt; caze++){ n=sc.nextInt(); d=sc.nextInt(); rs=new R[n]; for(int i=0; i<n; i++){ int p=sc.nextInt(); int m=sc.nextInt(); rs[i]=new R(p, m); } solve(); } } void solve(){ long left=0, right=INF; for(int i=0; i<n; i++){ rs[i].p*=2; } d*=2; sort(rs, new Comparator<R>(){ @Override public int compare(R r1, R r2){ return r1.p-r2.p; } }); for(int i=0; i<1000; i++){ long mid=(left+right)/2; if(check(mid)){ right=mid; }else{ left=mid; } } debug(right, right/2.0); answer(String.format("%.1f", right/2.0)); } boolean check(long t){ long left=-INF; for(int j=0; j<n; j++){ for(int i=0; i<rs[j].m; i++){ if(rs[j].p+t<left+d){ return false; } left=max(left+d, rs[j].p-t); // [left+d, INF) and [p-t , p+t] } } return true; } class R{ int p, m; R(int p, int m){ this.p=p; this.m=m; } } void answer(String s){ println("Case #"+caze+": "+s); } void println(String s){ System.out.println(s); } void print(String s){ System.out.print(s); } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } public static void main(String[] args){ try{ System.setIn(new FileInputStream( "D:/contest_workspace/gcj_2011_round1b/dat/B-large.in")); System.setOut(new PrintStream(new FileOutputStream( "D:/contest_workspace/gcj_2011_round1b/dat/B-large.out"))); }catch(Exception e){} new B().run(); System.out.flush(); System.out.close(); } }
0 件のコメント:
コメントを投稿