結果
| 問題 | No.468 役に立つ競技プログラミング実践編 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-12-19 17:44:10 |
| 言語 | C90(gcc15) (gcc 15.2.0) |
| 結果 |
AC
|
| 実行時間 | 241 ms / 2,000 ms |
| コード長 | 1,583 bytes |
| 記録 | |
| コンパイル時間 | 194 ms |
| コンパイル使用メモリ | 39,456 KB |
| 最終ジャッジ日時 | 2026-02-23 23:52:05 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 31 |
| other | AC * 6 |
コンパイルメッセージ
main.c: In function 'main':
main.c:64:9: warning: incompatible implicit declaration of built-in function 'memset' [-Wbuiltin-declaration-mismatch]
64 | memset(limit,1,sizeof(limit));
| ^~~~~~
main.c:3:1: note: include '<string.h>' or provide a declaration of 'memset'
2 | #include<stdlib.h>
+++ |+#include <string.h>
3 | #define max(x,y) ((x)>(y)?(x):(y))
ソースコード
#include<stdio.h>
#include<stdlib.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
long n,m,work[100000];
typedef struct{
int cost;
long f,e;
} node;
node pass[500000];
long index[100000];
long next[100000];
long time[100000];
long limit[100000];
int cmp_1(const void *a,const void*b){
return ((node*)a)->f-((node*)b)->f;
}
int cmp_2(const void*a,const void*b){
return ((node*)a)->e-((node*)b)->e;
}
int main(){
long i,j,count,cri;
scanf("%ld %ld",&n,&m);
for(i=0;i<m;i++){
scanf("%ld %ld %d",&pass[i].f,&pass[i].e,&pass[i].cost);
work[pass[i].e]++;
}
qsort(pass,m,sizeof(node),cmp_1);
j=0;
for(i=0;i<m && j<n-1;i++){
if(pass[i].f!=j){
j++;
index[j]=i;
}
}
count=1;
for(i=0;i<n;i++){
count--;
for(j=index[next[i]];pass[j].f==next[i];j++){
time[pass[j].e]=max(time[pass[j].e],time[next[i]]+(long)pass[j].cost);
work[pass[j].e]--;
if(work[pass[j].e]==0){
count++;
next[i+count]=pass[j].e;
}
}
}
printf("%ld ",time[n-1]);
qsort(pass,m,sizeof(node),cmp_2);
j=0;
for(i=0;i<m;i++){
if(pass[i].e!=j){
j++;
index[j]=i;
}
work[pass[i].f]++;
}
cri=1;
next[0]=n-1;
memset(limit,1,sizeof(limit));
limit[n-1]=time[n-1];
count=1;
for(i=0;i<n;i++){
count--;
for(j=index[next[i]];pass[j].e==next[i];j++){
limit[pass[j].f]=min(limit[pass[j].f],limit[next[i]]-(long)pass[j].cost);
work[pass[j].f]--;
if(work[pass[j].f]==0){
if(time[pass[j].f]==limit[pass[j].f]){
cri++;
}
count++;
next[i+count]=pass[j].f;
}
}
}
printf("%ld/%ld\n",n-cri,n);
return 0;
}