# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
272285 | MrTEK | Restore Array (RMI19_restore) | Java | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
import java.util.*;
public class Main{
public static class Edge {
public int u,v,cost;
public Edge(int _u,int _v,int _cost) {
u = _u;
v = _v;
cost = _cost;
}
}
static int n,m;
static int[] pre;
static ArrayList <Edge> edges;
static boolean SP() {
pre[0] = 0;
for (int i = 1 ; i <= n ; i++)
pre[i] = Integer.MAX_VALUE;
for (int i = 0 ; i < n ; i++) {
for (Edge j : edges) {
int val = pre[j.u] + j.cost;
pre[j.v] = Math.min(val,pre[j.v]);
}
}
for (Edge j : edges) {
int val = pre[j.u] + j.cost;
if (pre[j.v] > val)
return false;
}
return true;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
m = scan.nextInt();
edges = new ArrayList<Edge>();
pre = new int[n+1];
for (int i = 1 ; i <= n ; i++) {
edges.add(new Edge(i-1,i,1));
edges.add(new Edge(i,i-1,0));
}
while((m--) != 0) {
int l = scan.nextInt();
int r = scan.nextInt();
int k = scan.nextInt();
int val = scan.nextInt();
l++;
r++;
if (val == 0)
edges.add(new Edge(l-1,r,r-l-k+1));
else
edges.add(new Edge(r,l-1,-(r-l-k+1)));
}
if (SP() == false)
System.out.println(-1);
else {
for (int i = n ; i >= 1 ; i--)
pre[i] -= pre[i - 1];
for (int i = 1 ; i <= n ; i++)
System.out.printf("%d ",pre[i]);
System.out.println();
}
}
}