■1133 Water Tank
実装ゲー.import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import javax.swing.*; import java.awt.*; import static java.lang.Math.*; import static java.util.Arrays.*; // AC public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-6; int d; int n; int[] x, h; int m; int[] f, dv; int l; int[] p, t; void run(){ d=sc.nextInt(); for(int k=0; k<d; k++){ n=sc.nextInt()+1; x=new int[n+1]; h=new int[n+1]; x[0]=0; x[n]=100; h[0]=h[n]=50; for(int i=1; i<n; i++){ x[i]=sc.nextInt(); h[i]=sc.nextInt(); } m=sc.nextInt(); f=new int[m]; dv=new int[m]; for(int i=0; i<m; i++){ f[i]=sc.nextInt(); dv[i]=sc.nextInt(); } l=sc.nextInt(); p=new int[l]; t=new int[l]; for(int i=0; i<l; i++){ p[i]=sc.nextInt(); t[i]=sc.nextInt(); } solve(); } } double[] y, a; double time; void solve(){ y=new double[n]; a=new double[n]; for(int j=0; j<m; j++){ for(int i=0; i<n; i++){ if(x[i]<f[j]&&f[j]<x[i+1]){ a[i]+=dv[j]/30.0; } } } // Visualizer v=new Visualizer(); double[] ans=new double[l]; fill(ans, -1); for(time=0;;){ double min=INF; for(int i=0; i<n; i++){ if(a[i]>EPS){ if(y[i]+EPS<h[i]){ min=min(min, (h[i]-y[i])*(x[i+1]-x[i])/a[i]); } if(y[i]+EPS<h[i+1]){ min=min(min, (h[i+1]-y[i])*(x[i+1]-x[i])/a[i]); } } } if(min==INF){ for(;;); } for(int j=0; j<l; j++){ if(time<t[j]+EPS&&t[j]+EPS<time+min){ for(int i=0; i<n; i++){ if(x[i]<p[j]&&p[j]<x[i+1]){ ans[j]=min(y[i]+(t[j]-time)*a[i]/(x[i+1]-x[i]), 50); } } } } boolean all50=true; time+=min; for(int i=0; i<n; i++){ y[i]+=min*a[i]/(x[i+1]-x[i]); all50&=abs(y[i]-50)<EPS; } // v.repaint(); // sleep(1000); if(all50){ break; } double[] a2=new double[n]; for(int j=0; j<n; j++){ boolean[] bottom=new boolean[n]; int left, right; for(left=j; left>=0&&y[left]+EPS>h[left]; left--); for(right=j; right<n&&y[right]+EPS>h[right+1]; right++); if(y[left]+EPS<y[j]){ for(int i=left; i<n&&abs(y[i]-y[left])<EPS; i++){ bottom[i]=true; } } if(y[right]+EPS<y[j]){ for(int i=right; i>=0&&abs(y[i]-y[right])<EPS; i--){ bottom[i]=true; } } if(abs(y[left]-y[j])<EPS&&abs(y[right]-y[j])<EPS){ for(int i=left; i<=right; i++){ bottom[i]=true; } } int sum=0; for(int i=0; i<n; i++){ if(bottom[i]){ sum+=x[i+1]-x[i]; } } for(int i=0; i<n; i++){ if(bottom[i]){ a2[i]+=a[j]/sum*(x[i+1]-x[i]); } } } a=a2.clone(); } for(int i=0; i<l; i++){ println(ans[i]+EPS<0?"50.0":ans[i]+""); } } void sleep(long millis){ try{ Thread.sleep(millis); }catch(InterruptedException e){ e.printStackTrace(); } } void debug(Object... os){ // System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } public class Visualizer extends JFrame{ Visualizer(){ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); getContentPane().add(new MainPanel(), BorderLayout.CENTER); pack(); } class MainPanel extends JPanel{ MainPanel(){ setPreferredSize(new Dimension(512, 512)); } public void paintComponent(Graphics g){ int width=getWidth(); int height=getHeight(); for(int i=0; i<n; i++){ g.setColor(Color.BLUE); g.fillRect(x[i]*4, height-(int)(y[i]*4), (x[i+1]-x[i])*4, (int)(y[i]*4)); g.drawString(String.format("%.4f", a[i]), x[i]*4, height/2); } for(int i=0; i<=n; i++){ g.setColor(Color.RED); g.drawLine(x[i]*4, height-h[i]*4, x[i]*4, height); } g.setColor(Color.BLACK); g.drawString(""+time, 100, 100); } } } }
0 件のコメント:
コメントを投稿