Advertisement
Guest User

C - Aerotaxi - 2

a guest
Jun 22nd, 2015
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.79 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.StreamTokenizer;
  5. import java.util.ArrayList;
  6.  
  7.  
  8. public class AeroTaxi_2_er {
  9.  
  10.     public static void main(String[] args) throws IOException {
  11.         Flying2 flying = new Flying2();
  12.         flying.solve();
  13.         flying.print();
  14.     }
  15. }
  16.  
  17. class Flying2 {
  18.    
  19.     class Segment {
  20.        
  21.         Segment(int left, int right, int sl, int cl){
  22.             this.left = left;
  23.             this.right = right;
  24.             downPoint = left+1;
  25.             startLevel = sl;
  26.             currentLevel = cl;
  27.             points = new int[n];
  28.         }
  29.        
  30.         Segment(int left, int right, int downPoint, int sl, int cl){
  31.             this.left = left;
  32.             this.right = right;
  33.             this.downPoint = downPoint;
  34.             startLevel = sl;
  35.             currentLevel = cl;
  36.             points = new int[n];
  37.         }
  38.        
  39.         Segment(Segment s) {
  40.             this.left = s.left;
  41.             this.right = s.right;
  42.             this.downPoint = s.downPoint;
  43.             startLevel = s.startLevel;
  44.             currentLevel = s.currentLevel;
  45.             points = new int[n];
  46.             for (int i = 0; i < currentLevel; i++){
  47.                 points[i] = s.points[i];
  48.             }          
  49.         }
  50.        
  51.         void upgrade(int dp, int r){
  52.             downPoint = dp+1;
  53.             points[currentLevel] = dp;
  54.             currentLevel++;
  55.             right = r;
  56.         }
  57.        
  58.         public String toString() {
  59.             return "[" + left + ", " + right + "] (" + downPoint + ") (" + startLevel + " -> " + currentLevel + ")";
  60.         }
  61.        
  62.         int left;
  63.         int right;
  64.         int downPoint;
  65.         int startLevel;
  66.         int currentLevel;
  67.         int[] points;
  68.     }
  69.    
  70.    
  71.     Flying2() throws IOException {
  72.         in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  73.         n = nextInt();
  74.         t = nextInt();
  75.        
  76.         free = new ArrayList<ArrayList<Segment>>(n);
  77.         for (int i = 0; i < n; i++){
  78.             free.add(new ArrayList<Segment>());
  79.         }
  80.        
  81.         freeSize = new int[n];
  82.        
  83.         int c;
  84.         int lb;
  85.         int rb;
  86.         int s;
  87.         int f;
  88.        
  89.         for (int i = 0; i < n; i++){
  90.             c = nextInt();
  91.            
  92.             lb = 0;
  93.            
  94.             for (int j = 0; j < c; j++){
  95.                 s = nextInt();
  96.                 f = nextInt();
  97.                
  98.                 if (lb == s) {
  99.                     lb = f;
  100.                 }
  101.                 else {
  102.                     rb = s;
  103.                     free.get(i).add(new Segment(lb, rb, i, i));
  104.                     lb = f;
  105.                     freeSize[i]++;
  106.                 }
  107.             }
  108.            
  109.             rb = ALWAYS;
  110.             free.get(i).add(new Segment(lb, rb, i, i));
  111.             freeSize[i]++;
  112.            
  113.         }
  114.                                
  115.         union = new ArrayList<Segment>();
  116.         newUnion = new ArrayList<Segment>();
  117.         answer = new Segment(ALWAYS, ALWAYS, 0, 0);
  118.     }
  119.    
  120.     int nextInt() throws IOException {
  121.         in.nextToken();
  122.         return (int)in.nval;
  123.     }
  124.    
  125.    
  126.     boolean check(Segment s){
  127.         if ((s.right - s.left) >= t){
  128.             if (s.left < answer.left) {
  129.                 answer = s;            
  130.             }
  131.             return true;
  132.         }
  133.         return false;
  134.     }
  135.    
  136.     void phase(int startEchelon){
  137.         union.clear();
  138.         newUnion.clear();
  139.        
  140.         int szu = 0;
  141.         for (Segment s: free.get(startEchelon)){
  142.             if (check(s)) {
  143.                 break;
  144.             }          
  145.             union.add(new Segment(s));
  146.             szu++;
  147.         }      
  148.  
  149.         int sznu = 0;
  150.        
  151.         for (int i = startEchelon + 1; i < n; i++){
  152.            
  153.             if (szu == 0) {
  154.                 break;
  155.             }
  156.            
  157.             int iu = 0;
  158.             int ie = 0;
  159.            
  160.             while ((iu < szu) && (ie < freeSize[i])) {
  161.                
  162.                 Segment cs = free.get(i).get(ie);
  163.                 Segment us = union.get(iu);
  164.                
  165.                 if (answer.left <= us.left) {
  166.                     break;
  167.                 }
  168.                
  169.                 if (cs.right <= us.downPoint) {
  170.                     ie++;
  171.                 }
  172.                 else if (cs.left <= us.left) {
  173.                     ie++;
  174.                 }
  175.                 else if (us.right < cs.left) {
  176.                     iu++;
  177.                 }
  178.                 else if (cs.left < us.downPoint) {
  179.                     Segment ns = new Segment(us);
  180.                     ns.upgrade(us.downPoint, cs.right);
  181.                     if (check(ns)) {
  182.                         break;                     
  183.                     }
  184.                     newUnion.add(ns);                                  
  185.                     sznu++;
  186.                                         ie++;
  187.                 }
  188.                 else if (us.downPoint <= cs.left) {
  189.                     Segment ns = new Segment(us);
  190.                     ns.upgrade(cs.left, cs.right);
  191.                     if (check(ns)) {
  192.                         break;                     
  193.                     }
  194.                    
  195.                     newUnion.add(ns);                  
  196.                     sznu++;
  197.                     ie++;
  198.                 }
  199.                
  200.              }
  201.            
  202.             ArrayList<Segment> tmp = union;
  203.             union = newUnion;
  204.             newUnion = tmp;
  205.             szu = sznu;
  206.             newUnion.clear();
  207.             sznu = 0;
  208.            
  209.         }
  210.        
  211.     }
  212.    
  213.     void solve() {
  214.         for (int i = 0; i < n; i++){
  215.             phase(i);
  216.         }
  217.     }
  218.    
  219.     void print() {
  220.         System.out.println(answer.left);
  221.        
  222.         int h = answer.startLevel + 1;
  223.         int d = answer.currentLevel - answer.startLevel;
  224.         System.out.print(h);
  225.         System.out.print(" ");     
  226.         System.out.println(d);
  227.        
  228.         boolean first = true;
  229.         for (int i = answer.startLevel; i < answer.currentLevel; i++){
  230.             if (first) {
  231.                 first = false;
  232.             }
  233.             else {
  234.                 System.out.print(" ");
  235.             }
  236.             System.out.print(answer.points[i]);
  237.         }
  238.        
  239.         System.out.println();
  240.     }
  241.    
  242.    
  243.     Segment answer;
  244.    
  245.     ArrayList<Segment> union;
  246.     ArrayList<Segment> newUnion;
  247.    
  248.     ArrayList<ArrayList<Segment>> free;
  249.     int[] freeSize;
  250.    
  251.     StreamTokenizer in;
  252.    
  253.     int n;
  254.     int t;
  255.    
  256.     static final int ALWAYS = 1000*1000*1000 + 100*1000;
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement