Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], skipTags: ["script","noscript","style","textarea","code"], processEscapes: true }});

問題文

有理数列 $X_0, X_1, X_2, ..., X_N$ がある。各項は以下のように定義される。

$X_0 = 0$

$X_i = X_{i-1}$ $op_i$ $Y_i$ ($1 \leq i \leq N$). ただし $op_i$ は $＋$、$−$、$×$、$÷$のいずれかである。

$X_N$ を求めよ。

入力

入力は以下の形式に従う。与えられる数は全て整数である。

$N$
$o_1$ $Y_1$
$o_2$ $Y_2$
$...$
$o_N$ $Y_N$

$o_i = 1$ のとき $op_i$ は＋、$o_i = 2$ のとき $op_i$ は−、$o_i = 3$ のとき $op_i$ は×、$o_i = 4$ のとき $op_i$ は÷である。

制約

$1 \leq N \leq 10^5$

$1 \leq o_i \leq 4$

$-10^6 \leq Y_i \leq 10^6$

$o_i=4$ ならば $Y_i \neq 0$

$X_N$ は $-2^{31}$ 以上 $2^{31}$ 未満の整数となる。

出力

$X_N$ の値を1行に出力せよ。

Sample Input 1

4
1 1
4 2
2 4
3 4

Output for the Sample Input 1

-14

$X_0 = 0$

$X_1 = X_0 ＋ 1 = 1$

$X_2 = X_1 ÷ 2 = 1/2$

$X_3 = X_2 − 4 = -7/2$

$X_4 = X_3 × 4 = -14$

Solution in JAVA (judge verdict: Time Limit Exceeded)

import java.util.Scanner;
import java.math.BigInteger;

public class Main{
    public static void main(String [] args){
	Scanner in = new Scanner(System.in);

	int n = in.nextInt();
	int [] o = new int [n];
	int [] y = new int [n];

	for(int i = 0; i < n; ++i){
	    o[i] = in.nextInt();
	    y[i] = in.nextInt();
	}

	double x = 0;

	for(int i = 0; i < n; ++i){
	    int oo = o[i];
	    int yy = y[i];
	    if(oo == 1){ // +
		x += yy;
	    }else if(oo == 2){ // -
		x -= yy;
	    }else if(oo == 3){ // *
		x *= yy;
	    }else if(oo == 4){
		x /= yy;
	    }
	}

	int ans = 0;
	if(x > 0) ans = (int)(x + 0.0000000001);
	else      ans = (int)(x - 0.0000000001);

	if(Math.abs((double)ans - x) < 0.00001){
	    System.out.println("" + ans);
	}else{
	    BigInteger ue   = BigInteger.ZERO;
	    BigInteger sita = BigInteger.ONE;
	    int cnt = 0;

	    for(int i = 0; i < n; ++i){
		int oo = o[i];
		BigInteger yy = new BigInteger(String.valueOf(y[i]));

		if(oo == 1){ // +
		    ue = ue.add(sita.multiply(yy));
		}else if(oo == 2){ // -
		    ue = ue.subtract(sita.multiply(yy));
		}else if(oo == 3){ // *
		    ue   = ue.multiply(yy);
		    ++cnt;
		}else if(oo == 4){
		    sita = sita.multiply(yy);
		    --cnt;
		}

		if(Math.abs(cnt) > 5 || i == n - 1){
		    BigInteger gcd = ue.gcd(sita);
		    ue   = ue.divide(gcd);
		    sita = sita.divide(gcd);
		    cnt = 0;
		}
	    }
	    System.out.println("" + ue);
	}
    }
}