这道题的正解是 线段树,但是我们用朴素解法 枚举 也能在考试时拿到一定的分数。
一生最多进岛两次,第二段的进入时刻必须严格晚于第一段的离开时刻。进出时刻只能取自异事出现过的 ak 或 bk。把这些时刻两两配成停留 [L,R],扫一遍全部异事,就能算出这段的净功力。净功力大于 0 的停留先单独比较,再两两检查能不能接成两段。总功力更大的方案优先;一样大时,停留列表的字典序更小者优先。时刻一多,两两枚举再扫异事就会超时,所以后面要换成线段树。
#code-switcher
功夫迷小明一心想闯出名声。他所处的世界里藏着一座秘岛:人留在岛上时要按时间扣掉功力,岛上冒出来的异事却能把功力补回来。
一辈子里,上岛和离岛最多各发生两次;只去一趟,或者始终不上岛,也都允许。若第一次进入、离开的时刻记成 L1、R1,第二次进入必须严格晚于第一次离开,也就是 L2>R1,两段停留不能叠在一起。
假如时刻 L 上岛、时刻 R 离岛,这一段扣掉的功力是 (R−L)×c,意思是每个时间单位扣 c 点。
秘岛上共有 p 起异事。第 k 起能补上的功力是 wk,它占着闭区间 [ak,bk]。只有整段都落在同一次停留里面,也就是 L≤ak 并且 bk≤R,这起异事的功力才算拿到。
结算功力等于拿到的各起异事相加,再减掉停留期间扣掉的部分。各起异事的时段可以互相交叉,也可以完全叠在同一段时间上。
请替小明定下每次上岛和离岛的时刻,使结算功力达到最大。
首行两个整数 p 和 c。p 表示异事的起数,c 表示留在岛上时每个时间单位要扣的功力。
随后 p 行,每行三个整数,依次是这起异事的开始时刻 ak、结束时刻 bk、功力 wk。
第一行输出一个整数,表示能达到的最大结算功力。
后面用一行或两行写出停留的进入时刻和离开时刻。若最优选择是不上岛,这里改写 NA。若好几组停留的结算功力一样大,要输出字典序最小的那一组,并且每一段单独算出来的净功力都必须大于 0。有两段时,按进入时刻从早到晚输出。
上岛、离岛的时刻只能从这些异事出现过的时刻里挑。
上岛和离岛允许落在同一个时刻。
输入
2 10
1 2 3
5 6 4
输出
0
NA
说明
停留 [1,2] 的结算是 3−(2−1)×10=−7,停留 [5,6] 的结算是 4−(6−5)×10=−6,一次罩住全部的 [1,6] 则是 7−(6−1)×10=−43。每一段都是负数,所以上岛不如不去,答案是 0,并写出 NA。
输入
3 3
1 4 20
2 3 5
8 9 12
输出
25
1,4
8,9
说明
停留 [1,4] 能罩住前两起,结算为 20+5−(4−1)×3=16。
停留 [8,9] 罩住第三起,结算为 12−(9−8)×3=9。
若改成只留 [1,9],三起都能罩住,但结算只有 37−(9−1)×3=13,不如分成两段的 16+9=25。
输入
3 4
2 5 30
3 4 6
10 14 5
输出
24
2,5
说明
停留 [2,5] 罩住前两起,结算为 30+6−(5−2)×4=24。
停留 [10,14] 的结算是 5−(14−10)×4=−11,一次从 2 留到 14 的结算是 41−(14−2)×4=−7。这两段都不如只保留 [2,5]。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册