#37818: c++真的好猛


zhoudaniel02@gmail.com (周孝倫)

學校 : 銘傳大學
編號 : 235507
來源 : [223.140.157.105]
最後登入時間 :
2024-04-29 21:31:07
b966. 3. 線段覆蓋長度 -- 2016年3月apcs | From: [223.137.136.129] | 發表日期 : 2023-10-10 15:47

我用土法煉鋼的方法,把所有區間的值都+1,如果加了之後的值是1就代表他是第一次被找到,就在ans+1,最後ans就是答案了,用java實現會對70%後TLE,用python則是35%後TLE,c++就直接AC了

 
#39099: Re: c++真的好猛


r1cky (hehe)

學校 : 國立臺灣師範大學
編號 : 158637
來源 : [49.216.55.33]
最後登入時間 :
2024-05-05 13:24:20
b966. 3. 線段覆蓋長度 -- 2016年3月apcs | From: [1.34.88.173] | 發表日期 : 2024-01-13 17:34

我用土法煉鋼的方法,把所有區間的值都+1,如果加了之後的值是1就代表他是第一次被找到,就在ans+1,最後ans就是答案了,用java實現會對70%後TLE,用python則是35%後TLE,c++就直接AC了

建議想一下為什麼 Java 會 TLE (Python 陣列存取慢就算了),是不是因為方法不對 ? (題外話是這題 Python 方法對,常數不要太大其實也有機會過,Java 的話是方法對肯定會過。)


可以想像一下,構造一個極端測試資料,這裡每個區間都很大,都是 $1 \sim 10^7$ 之類的 (就是題目上面寫的資料範圍),然後有 $10^4$ 個線段區間,長得像下面那樣,那照你的方法也就是要把陣列 $10^{11}$ 個都 $+1$ ,這應該是連 C++ 也沒辦法馬上算出來的。


10000

1 10000000

1 10000000

1 10000000

1 10000000

...

1 10000000

基於某些我不知道的原因,這題沒有這種測試資料,所以土法煉鋼有可能會過,但據我所知官方考試一定會有這種「機車」的資料,真實經歷是以前我高中考 APCS 的時候拿最糟情況時間 $O(N^2)$ 的程式拿去唬爛一題 $N = 10^5$ 的題目,只拿到小子題 ($N$ 很小) 的分數,完整的一分都沒拿到。

對於自己作法有沒有上述提到的問題有疑慮的, 我推薦可以試看看這題,裡面放了我說的極端測資,題目跟條件跟這題都是一樣的 : https://zerojudge.tw/ShowProblem?problemid=f855 (第 3 題 線段覆蓋長度 測資加強版)

最後感謝大家看到這裡 

 
ZeroJudge Forum