Guest User

Untitled

a guest
Jan 22nd, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.92 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3. import java.math.*;
  4.  
  5. public class Main implements Runnable {
  6.     private BufferedReader in;
  7.     private PrintWriter out;
  8.     private StringTokenizer st;
  9.     private Random rnd;
  10.    
  11.     class Lesson implements Comparable<Lesson> {
  12.         long a, b;
  13.         int c, diff;
  14.        
  15.         Lesson(long a, long b, int c) {
  16.             this.a = a;
  17.             this.b = b;
  18.             this.c = c;
  19.             this.diff = (int) (b - a);
  20.         }
  21.        
  22.         public int compareTo(Lesson o) {
  23.             return this.c - o.c;
  24.         }
  25.     }
  26.    
  27.     class Pair {
  28.         int lesson, diff;
  29.        
  30.         Pair(int a, int b) {
  31.             this.lesson = a;
  32.             this.diff = b;
  33.         }
  34.     }
  35.    
  36.     final int max = 110;
  37.    
  38.     public void solve() throws IOException {
  39.         int daysCount = nextInt(), lessonsCount = nextInt();
  40.         long k = nextLong();
  41.        
  42.         Lesson[] lessons = new Lesson[lessonsCount];
  43.         for(int i = 0; i < lessonsCount; i++) lessons[i] = new Lesson(nextLong(), nextLong(), nextInt());
  44.         //Arrays.sort(lessons);
  45.        
  46.         boolean[][][] d = new boolean[daysCount + 1][lessonsCount][110];
  47.         Pair[][][] p = new Pair[daysCount + 1][lessonsCount][110];
  48.         long[][][] total = new long[daysCount + 1][lessonsCount][110];
  49.        
  50.         // base
  51.         for(int lesson = 0; lesson < lessonsCount; lesson++) {
  52.             for(int tasks = 0; tasks <= lessons[lesson].diff; tasks++) {
  53.                 d[1][lesson][tasks] = true;
  54.                 total[1][lesson][tasks] = lessons[lesson].a + (long) tasks;
  55.             }
  56.         }
  57.        
  58.         // dyn
  59.         for(int day = 1; day < daysCount; day++) {
  60.             for(int curLes = 0; curLes < lessonsCount; curLes++) {
  61.                 for(int newLes = 0; newLes < lessonsCount; newLes++) {
  62.                     if(lessons[curLes].c >= lessons[newLes].c) continue;
  63.                    
  64.                     for(int tasks = 0; tasks < max; tasks++) {
  65.                         if(!d[day][curLes][tasks]) continue;
  66.                        
  67.                         long var1 = (lessons[curLes].a + (long) tasks) + k;
  68.                         long var2 = (lessons[curLes].a + (long) tasks) * k;
  69.                        
  70.                        
  71.                         //out.println((day + 1) + " " + var1 + " " + var2);
  72.                        
  73.                         if(lessons[newLes].a <= var1 && var1 <= lessons[newLes].b) {
  74.                             int diff = (int) (var1 - lessons[newLes].a);
  75.                            
  76.                             long new_total = total[day][curLes][tasks] + var1;
  77.                            
  78.                             if(!d[day + 1][newLes][diff] || new_total > total[day + 1][newLes][diff] ) {
  79.                                 d[day + 1][newLes][diff] = true;
  80.                                 p[day + 1][newLes][diff] = new Pair(curLes, tasks);
  81.                                 total[day + 1][newLes][diff] = new_total;
  82.                             }
  83.                         }
  84.                        
  85.                         if(lessons[newLes].a <= var2 && var2 <= lessons[newLes].b) {
  86.                             int diff = (int) (var2 - lessons[newLes].a);
  87.                            
  88.                             long new_total = total[day][curLes][tasks] + var2;
  89.                            
  90.                             //out.println(diff);
  91.                            
  92.                             if(!d[day + 1][newLes][diff] || new_total > total[day + 1][newLes][diff] ) {
  93.                                 d[day + 1][newLes][diff] = true;
  94.                                 p[day + 1][newLes][diff] = new Pair(curLes, tasks);
  95.                                 total[day + 1][newLes][diff] = new_total;
  96.                             }
  97.                         }
  98.                     }
  99.                 }
  100.             }
  101.         }
  102.        
  103.         int daysPointer = daysCount;
  104.         int lesPointer = -1;
  105.         int tasksPointer = -1;
  106.         boolean finded = false;
  107.         long curRes = -1;
  108.        
  109.        
  110.        
  111.         for(int les = 0; les < lessonsCount; les++) {
  112.             for(int tasks = 0; tasks < max; tasks++) {
  113.                 if(d[daysCount][les][tasks]) {
  114.                     finded = true;
  115.                    
  116.                     if(total[daysCount][les][tasks] > curRes) {
  117.                         curRes = total[daysCount][les][tasks];
  118.                         lesPointer = les;
  119.                         tasksPointer = tasks;
  120.                     }
  121.                 }
  122.             }
  123.         }
  124.        
  125.         if(finded) {
  126.             out.println("YES");
  127.            
  128.             Stack<Pair> path = new Stack<Pair>();
  129.             path.add(new Pair(lesPointer, tasksPointer));
  130.            
  131.             while(daysPointer > 1) {
  132.                 Pair curPair = p[daysPointer][lesPointer][tasksPointer];
  133.                 path.add(curPair);
  134.                
  135.                 --daysPointer;
  136.                 lesPointer = curPair.lesson;
  137.                 tasksPointer = curPair.diff;
  138.             }
  139.            
  140.             for(int i = 0; i < daysCount; i++) {
  141.                 Pair curPair = path.pop();
  142.                
  143.                 int id = curPair.lesson + 1;
  144.                 long howMuch = lessons[curPair.lesson].a + (long) curPair.diff;
  145.                
  146.                 out.println(id + " " + howMuch);
  147.             }
  148.         } else {
  149.             out.println("NO");
  150.         }
  151.     }
  152.    
  153.    
  154.     public void run() {
  155.         try {  
  156.             //in = new BufferedReader(new FileReader("input.txt"));
  157.             //out = new PrintWriter(new FileWriter("output.txt"));
  158.            
  159.             in = new BufferedReader(new InputStreamReader(System.in));
  160.             out = new PrintWriter(System.out);
  161.            
  162.             st = null;
  163.             rnd = new Random();
  164.            
  165.             solve();
  166.            
  167.             out.close();
  168.         } catch(Exception e) {
  169.             e.printStackTrace();
  170.             System.exit(1);
  171.         }
  172.     }
  173.    
  174.     public static void main(String[] args) {
  175.         new Main().run();
  176.     }
  177.    
  178.     private String nextToken() throws IOException, NullPointerException {
  179.         while(st == null || !st.hasMoreTokens()) {
  180.             st = new StringTokenizer(in.readLine());
  181.         }
  182.        
  183.         return st.nextToken();
  184.     }
  185.    
  186.     private int nextInt() throws IOException {
  187.         return Integer.parseInt(nextToken());
  188.     }
  189.    
  190.     private long nextLong() throws IOException {
  191.         return Long.parseLong(nextToken());
  192.     }
  193.    
  194.     private double nextDouble() throws IOException {
  195.         return Double.parseDouble(nextToken());
  196.     }
  197. }
Add Comment
Please, Sign In to add comment