■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 件のコメント:
コメントを投稿