COGS2897 - 天天爱射击

COGS2897 - Click Here

  

Description

  小C爱上了一款名字叫做《天天爱射击》的游戏,在这款游戏中可以用子弹将木板打碎。如图所示,这个游戏有一些平行于x轴的木板。现在有一些子弹,按顺序沿着y轴方向向这些木板射去。第i块木板被S_i个子弹击穿以后,就会碎掉消失。一个子弹可以贯穿其轨迹上的全部木板,特别的,如果一个子弹触碰到木板的边缘,也视为贯穿木板。

  小C现在知道了游戏中n块木板位置,以及知道了m个子弹起始位置。现在问你每个子弹射出去以后,有多少木板会被击穿?

  

Input

  第一行两个整数n和m,表示木板数量和子弹数量。其中1 <= n,m <= 200,000。

  接下来n行,每行3个整数x_1,x_2,S,表示每块木板的左端点x坐标、右端点x坐标,以及贯穿多少次会碎掉。其中保证1 <= x_1 <= x_2 <=200,000 且1 <= S <=200,000。

  接下来m行,每行一个整数x,表示每个子弹的x坐标。子弹按照发射顺序给出。其中保证1 <= x <= 200,000。

  

Output

  m 行,每行一个整数。表示每颗子弹射出去后,有多少木板碎掉。

  

Solutions

  似乎是THUPC2017的题。初次见到是在THUPC2018练习赛,那时候写了主席树做法,结果却一直WA,卡了一小时都没过。因此对这题怨念很大…

  

  正着思考问题似乎很困难,我们考虑每个木板被哪个子弹破坏

  对于每个木板,能够二分答案求出是被哪个子弹破坏。同时注意到子弹间对木板的影响相互独立,因此能够整体二分解决。时间复杂度$O((n+m) \log m \log x)$。

  该题还存在一个$\log$做法的。考虑到查询被哪个子弹破坏的过程,本质上是询问区间第$k$个($k$为贯穿数)射出的子弹。该问题为静态区间$k$大问题,可以直接主席树解决。时间复杂度$O(n \log x)$

  

CODE

CODE(主席树) - Click Here

CODE(整体二分) - Click Here

本站总访问量次 | 本站访客数人次

Powered by Hexo | Designed by iTimeTraveler | Refined by CSHwang