답안 #258949

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
258949 2020-08-06T20:10:44 Z Bruteforceman 치료 계획 (JOI20_treatment) C++11
0 / 100
3000 ms 3068 KB
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
const long long inf = 1e16;
long long d[maxn];
struct data {
  int t, l, r, c;
} a[maxn];
int n;
int par[maxn];

int leftAfter(int x, int t) {
  if(x == 1) return 1;
  return x + t;
}
int rightAfter(int x, int t) {
  if(x == n) return n;
  return x - t;
}

bool isEdge(data p, data q) {
  if(q.r < n && p.t + p.r > q.t + q.r) return false;
  if(p.t < q.t) {
    int l = 1;
    int r = rightAfter(p.r, (q.t - p.t));
    return !(l > r || r + 1 < q.l);
  } else {
    int l = leftAfter(q.l,  (p.t - q.t));
    int r = rightAfter(q.r, (p.t - q.t));
    return !(l > r || p.r + 1 < l);
  }
}

int main() {
  int m;
  scanf("%d %d", &n, &m);
  for(int i = 1; i <= m; i++) {
    scanf("%d %d %d %d", &a[i].t, &a[i].l, &a[i].r, &a[i].c);
  }
  priority_queue <pair <long long, int>, 
                  vector <pair <long long, int>>,
                  greater <pair <long long, int>>> Q;
  for(int i = 1; i <= m; i++) {
    if(a[i].l == 1) {
      d[i] = a[i].c;
      Q.emplace(d[i], i);
    } else {
      d[i] = inf;
    }
  }
  while(!Q.empty()) {
    int node = Q.top().second;
    long long dist = Q.top().first;
    Q.pop();
    if(dist != d[node]) continue;
    for(int i = 1; i <= m; i++) {
      if(isEdge(a[node], a[i]) && d[i] > d[node] + a[i].c) {
        d[i] = d[node] + a[i].c;
        par[i] = node;
        Q.emplace(d[i], i);
      }
    }
  }
  long long ans = inf;
  for(int i = 1; i <= m; i++) {
    if(a[i].r == n) ans = min(ans, d[i]);
  }
  if(ans == inf) ans = -1;
  printf("%lld\n", ans);
  return 0;
}

Compilation message

treatment.cpp: In function 'int main()':
treatment.cpp:36:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &n, &m);
   ~~~~~^~~~~~~~~~~~~~~~~
treatment.cpp:38:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d %d", &a[i].t, &a[i].l, &a[i].r, &a[i].c);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3082 ms 3068 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Incorrect 0 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Incorrect 0 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3082 ms 3068 KB Time limit exceeded
2 Halted 0 ms 0 KB -