Guest User

Untitled

a guest
Oct 2nd, 2011
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.82 KB | None | 0 0
  1. import java.io.*;
  2. import java.math.*;
  3. import java.util.*;
  4. import static java.lang.Math.*;
  5.  
  6. public class Timus_1587 implements Runnable {
  7.    
  8.     StreamTokenizer tok;
  9.     BufferedReader in;
  10.     PrintWriter out;
  11.     boolean timus = System.getProperty("ONLINE_JUDGE") != null;
  12.    
  13.     void init() throws IOException {
  14.         if (timus) {
  15.             in = new BufferedReader(new InputStreamReader(System.in));
  16.             tok = new StreamTokenizer(in);
  17.             out = new PrintWriter(System.out);
  18.         } else {
  19.             in = new BufferedReader(new FileReader("input.txt"));
  20.             tok = new StreamTokenizer(in);
  21.             out = new PrintWriter("output.txt");
  22.         }
  23.     }
  24.    
  25.     int readInt() throws IOException {
  26.         tok.nextToken();
  27.         return (int) tok.nval;
  28.     }
  29.    
  30.     String readString() throws IOException {
  31.         tok.nextToken();
  32.         return tok.sval;
  33.     }
  34.    
  35.     public static void main(String[] args) {
  36.         new Thread(new Timus_1587()).start();
  37.     }
  38.    
  39.     @Override
  40.     public void run() {
  41.         try {
  42.             if (timus) {
  43.                 init();
  44.                 solve();
  45.                 out.flush();
  46.             } else {
  47.                 long t1 = System.currentTimeMillis();
  48.                 init();
  49.                 solve();
  50.                 out.close();
  51.                 long t2 = System.currentTimeMillis();
  52.                 System.out.println(t2 - t1);
  53.             }
  54.         } catch(IOException e) {
  55.             System.exit(1);
  56.         }
  57.     }
  58.    
  59.     int compare(int twos1, int threes1, int twos2, int threes2) {
  60.         double pow1 = twos1 * log(2) + threes1 * log(3);
  61.         double pow2 = twos2 * log(2) + threes2 * log(3);
  62.         if (pow1 > pow2) return 1;
  63.         if (pow1 < pow2) return -1;
  64.         return 0;
  65.     }
  66.    
  67.     BigInteger calculateAnswer(int twos, int threes) {
  68.         BigInteger x = BigInteger.valueOf(2).pow(twos);
  69.         BigInteger y = BigInteger.valueOf(3).pow(threes);
  70.         return x.multiply(y);
  71.     }
  72.    
  73.     void solve() throws IOException {
  74.         int n = readInt();
  75.         int[] a = new int[n + 1];
  76.         for (int i = 1; i <= n; i++) {
  77.             a[i] = readInt();
  78.         }
  79.         if (n == 1) {
  80.             out.println(a[n]);
  81.             return;
  82.         }
  83.         int[] d2pos = new int[n + 1]; Arrays.fill(d2pos, -1);
  84.         int[] d2neg = new int[n + 1]; Arrays.fill(d2neg, -1);
  85.         int[] d3pos = new int[n + 1]; Arrays.fill(d3pos, -1);
  86.         int[] d3neg = new int[n + 1]; Arrays.fill(d3neg, -1);
  87.         for (int i = 1; i <= n; i++) {
  88.             int c = a[i];
  89.             switch (c) {
  90.             case 1:
  91.                 d2pos[i] = max(d2pos[i - 1], 0);
  92.                 d3pos[i] = max(d3pos[i - 1], 0);
  93.                 if (d2neg[i - 1] >= 0) d2neg[i] = d2neg[i - 1];
  94.                 if (d2neg[i - 1] >= 0) d3neg[i] = d3neg[i - 1];
  95.                 break;
  96.             case 2:
  97.                 d2pos[i] = max(d2pos[i - 1], 0) + 1;
  98.                 d3pos[i] = max(d3pos[i - 1], 0);
  99.                 if (d2neg[i - 1] >= 0) d2neg[i] = d2neg[i - 1] + 1;
  100.                 if (d3neg[i - 1] >= 0) d3neg[i] = d3neg[i - 1];
  101.                 break;
  102.             case 3:
  103.                 d2pos[i] = max(d2pos[i - 1], 0);
  104.                 d3pos[i] = max(d3pos[i - 1], 0) + 1;
  105.                 if (d2neg[i - 1] >= 0) d2neg[i] = d2neg[i - 1];
  106.                 if (d3neg[i - 1] >= 0) d3neg[i] = d3neg[i - 1] + 1;
  107.                 break;
  108.             case -1:
  109.                 if (d2neg[i - 1] >= 0) d2pos[i] = d2neg[i - 1];
  110.                 if (d3neg[i - 1] >= 0) d3pos[i] = d3neg[i - 1];
  111.                 d2neg[i] = max(d2pos[i - 1], 0);
  112.                 d3neg[i] = max(d3pos[i - 1], 0);
  113.                 break;
  114.             case -2:
  115.                 if (d2neg[i - 1] >= 0) d2pos[i] = d2neg[i - 1] + 1;
  116.                 if (d3neg[i - 1] >= 0) d3pos[i] = d3neg[i - 1];
  117.                 d2neg[i] = max(d2pos[i - 1], 0) + 1;
  118.                 d3neg[i] = max(d3pos[i - 1], 0);
  119.                 break;
  120.             case -3:
  121.                 if (d2neg[i - 1] >= 0) d2pos[i] = d2neg[i - 1];
  122.                 if (d3neg[i - 1] >= 0) d3pos[i] = d3neg[i - 1] + 1;
  123.                 d2neg[i] = max(d2pos[i - 1], 0);
  124.                 d3neg[i] = max(d3pos[i - 1], 0) + 1;
  125.                 break;
  126.             }
  127.         }
  128.         int maxIndex = 0;
  129.         for (int i = 1; i <= n; i++) {
  130.             if (compare(d2pos[i], d3pos[i],
  131.                     d2pos[maxIndex], d3pos[maxIndex]) == 1) {
  132.                 maxIndex = i;
  133.             }
  134.         }
  135.         if (d2pos[maxIndex] < 0 || d3pos[maxIndex] < 0) {
  136.             int max = a[1];
  137.             for (int i = 2; i <= n; i++) {
  138.                 max = max(max, a[i]);
  139.             }
  140.             out.println(max);
  141.             return;
  142.         }
  143.         BigInteger ans = calculateAnswer(d2pos[maxIndex], d3pos[maxIndex]);
  144.         out.println(ans);
  145.     }
  146.    
  147. }
  148.  
  149.  
Advertisement
Add Comment
Please, Sign In to add comment