Submission #274571

#TimeUsernameProblemLanguageResultExecution timeMemory
274571GilgameshCollecting Stamps 3 (JOI20_ho_t3)Java
15 / 100
2597 ms123184 KiB
import java.util.*; import java.io.*; public class ho_t3 { final static int MOD = 1000000007; final static int intMax = 1000000000; final static int intMin = -1000000000; final static int[] dx = { 0, 0, -1, 1 }; final static int[] dy = { -1, 1, 0, 0 }; static int T; static class Reader { final private int BUFFER_SIZE = 1 << 16; private DataInputStream din; private byte[] buffer; private int bufferPointer, bytesRead; public Reader() { din = new DataInputStream(System.in); buffer = new byte[BUFFER_SIZE]; bufferPointer = bytesRead = 0; } public Reader(String file_name) throws IOException { din = new DataInputStream(new FileInputStream(file_name)); buffer = new byte[BUFFER_SIZE]; bufferPointer = bytesRead = 0; } public String readLine() throws IOException { byte[] buf = new byte[360]; // line length int cnt = 0, c; while ((c = read()) != -1) { if (c == '\n') break; buf[cnt++] = (byte) c; } return new String(buf, 0, cnt); } public int nextInt() throws IOException { int ret = 0; byte c = read(); while (c <= ' ') c = read(); boolean neg = (c == '-'); if (neg) c = read(); do { ret = ret * 10 + c - '0'; } while ((c = read()) >= '0' && c <= '9'); if (neg) return -ret; return ret; } public long nextLong() throws IOException { long ret = 0; byte c = read(); while (c <= ' ') c = read(); boolean neg = (c == '-'); if (neg) c = read(); do { ret = ret * 10 + c - '0'; } while ((c = read()) >= '0' && c <= '9'); if (neg) return -ret; return ret; } public double nextDouble() throws IOException { double ret = 0, div = 1; byte c = read(); while (c <= ' ') c = read(); boolean neg = (c == '-'); if (neg) c = read(); do { ret = ret * 10 + c - '0'; } while ((c = read()) >= '0' && c <= '9'); if (c == '.') { while ((c = read()) >= '0' && c <= '9') { ret += (c - '0') / (div *= 10); } } if (neg) return -ret; return ret; } private void fillBuffer() throws IOException { bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE); if (bytesRead == -1) buffer[0] = -1; } private byte read() throws IOException { if (bufferPointer == bytesRead) fillBuffer(); return buffer[bufferPointer++]; } public void close() throws IOException { if (din == null) return; din.close(); } } static long min(long a, long b) { return a < b ? a : b; } public static void main(String[] args) throws Exception { Reader in = new Reader(); int N = in.nextInt(); int L = in.nextInt(); int[] X = new int[N + 1]; int[] X2 = new int[N + 1]; int[] T = new int[N]; for(int i = 1; i <= N; ++i) { X[i] = in.nextInt(); } for(int i = 0; i < N; ++i) { T[i] = in.nextInt(); } for(int i = N; i >= 1; --i) { X2[N - i + 1] = L - X[i]; } long[][][][] dp = new long[N + 1][N + 1][N + 1][2]; //dp[i][j][k][l] = min time to i stamps, j left, k right, l = 0 last left, 1 last right for(int i = 0; i <= N; ++i) { for(int j = 0; j <= N; ++j) { for(int k = 0; k <= N; ++k) { dp[i][j][k][0] = Long.MAX_VALUE / 2; dp[i][j][k][1] = Long.MAX_VALUE / 2; } } } dp[0][0][0][0] = 0; dp[0][0][0][1] = 0; int ans = 0; for(int i = 0; i <= N; ++i) { for(int j = 0; j <= N; ++j) { for(int k = 0; k <= N; ++k) { if(j + k > N || j + k < i) continue; if(j > 0) { //transition from dp[i - 1][j - 1][k][0], dp[i - 1][j - 1][k][1], dp[i][j - 1][k][0], dp[i][j - 1][k][1] dp[i][j][k][0] = dp[i][j - 1][k][0] + X2[j] - X2[j - 1]; if(i > 0 && dp[i - 1][j - 1][k][0] + X2[j] - X2[j - 1] <= T[N - j]) dp[i][j][k][0] = min(dp[i][j][k][0], dp[i - 1][j - 1][k][0] + X2[j] - X2[j - 1]); dp[i][j][k][0] = min(dp[i][j][k][0], dp[i][j - 1][k][1] + X2[j] + X[k]); if(i > 0 && dp[i - 1][j - 1][k][1] + X2[j] + X[k] <= T[N - j]) dp[i][j][k][0] = min(dp[i][j][k][0], dp[i - 1][j - 1][k][1] + X2[j] + X[k]); } if(k > 0) { dp[i][j][k][1] = dp[i][j][k - 1][0] + X2[j] + X[k]; if(i > 0 && dp[i - 1][j][k - 1][0] + X2[j] + X[k] <= T[k - 1]) dp[i][j][k][1] = min(dp[i][j][k][1], dp[i - 1][j][k - 1][0] + X2[j] + X[k]); dp[i][j][k][1] = min(dp[i][j][k][1], dp[i][j][k - 1][1] + X[k] - X[k - 1]); if(i > 0 && dp[i - 1][j][k - 1][1] + X[k] - X[k - 1] <= T[k - 1]) dp[i][j][k][1] = min(dp[i][j][k][1], dp[i - 1][j][k - 1][1] + X[k] - X[k - 1]); } if(dp[i][j][k][0] < Long.MAX_VALUE / 2 || dp[i][j][k][1] < Long.MAX_VALUE / 2) ans = i; } } } System.out.println(ans); in.close(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...