
AtCoderのC-Choose Elementsで一部TLEになってしまいます。どの部分が時間を要しているのか、どのように改善すれば良いのかご教授いただきたいです。よろしくお願いします。
問題:https://atcoder.jp/contests/abc245/tasks/abc245_c
【プログラムの説明】
入力の読み込みを行う。
スタックを用いる。
二つの配列tmp2,3の初めの要素二つをスタックに入れる。
スタックの上の要素を見て、絶対値差が条件に合っているものを順次入れていく。
(countはスタック中の要素がtmp2,3で何番目に値するのかを記憶しておくもの)
(pointは行き止まりにあたった時にすぐに分岐に戻れるように分岐点の添え字を記憶しておくもの)
行き止まりにあたると、記憶して置いた分岐点まで戻り、間違いの道をNaNとして選べないようにしてから再度同じ操作を行う。
JavaScript
1const fs= require('fs'); 2 3function Main(input){ 4 input=input.split("\n"); 5 var tmp1=input[0].split(" "); 6 var tmp2 = input[1].split(" "); 7 var tmp3=input[2].split(" "); 8 for(var i=0;i<tmp1.length;i++){ 9 tmp1[i]=parseInt(tmp1[i]); 10 } 11 for(var i=0;i<tmp2.length;i++){ 12 tmp2[i]=parseInt(tmp2[i]); 13 } 14 for(var i=0;i<tmp3.length;i++){ 15 tmp3[i]=parseInt(tmp3[i]); 16 } 17 18 var a=new Array(tmp1[1]); 19 var count=new Array(); 20 var t=0, s=0; 21 var point=new Array(); 22 var k=0, num=0; 23 24 a[t]=tmp2[s]; 25 count[t]=s; 26 a[++t]=tmp3[s]; 27 count[t]=s; 28 29 point[k]=s; 30 while(1){ 31 if(num===0){ 32 if(Math.abs(tmp2[s+1]-a[t])<=tmp1[1] && Math.abs(tmp3[s+1]-a[t])<=tmp1[1]){ 33 a[++t]=tmp2[++s]; 34 point[++k]=t; 35 count[t]=s; 36 a[++t]=tmp3[s]; 37 count[t]=s; 38 }else if(Math.abs(tmp2[s+1]-a[t])<=tmp1[1]){ 39 a[++t]=tmp2[++s]; 40 count[t]=s; 41 }else if(Math.abs(tmp3[s+1]-a[t])<=tmp1[1]){ 42 a[++t]=tmp3[++s]; 43 count[t]=s; 44 }else{ 45 t=point[k--]; 46 num++; 47 } 48 if(s===tmp1[0]-1){ 49 console.log('Yes'); 50 return; 51 } 52 }else{ 53 if(k<-1){ 54 console.log('No'); 55 return; 56 } 57 if(a[t+1]===a[t]){ 58 t=point[k--]; 59 }else{ 60 s=count[t]; 61 if(tmp2[s+1]===a[t+2]){ 62 tmp2[s+1]=NaN; 63 }else if(tmp3[s+1]===a[t+2]){ 64 tmp3[s+1]=NaN; 65 } 66 num=0; 67 } 68 } 69 } 70} 71 72Main(fs.readFileSync("/dev/stdin", "utf-8"));
回答2件
あなたの回答
tips
プレビュー