LA 4329

2018-05-09  本文已影响0人  laochonger

题意:
一条大街上住着n个乒乓球爱好者,经常组织比赛。每个人都有一个技能值ai,每场比赛需要3个人:两名选手和一名裁判。规定裁判位置必须在两个选手的中间,而且技能值也必须在两个选手的中间,问一共能组织多少种比赛
输入 t(组数),n,ai...an按照住所从左到右输入技能值。

思路:考虑第i个人当裁判的情形,假设a1到a(i-1)中右有ci个比ai小,则有i-1-ci个比ai大;同理,假设a(i+1)中有di个比ai小,n-i-di个比ai大。所以,i当裁判时有ci(n-i-di)+di(i-1-ci),这样问题就转化为求ci与di
ci可以这样算:以ai为add函数中的下标k,若是存在这个下标,则ci+=1。
这里要注意这里add的是新出现的a(i-1),这里已经计算过对ci有影响的aj(j+1<i),所以add中k = a[i-1]。计算前缀时,read(以ci计算前缀的函数)中k=a[i]-1(因为这里将ai作为下标,而read求的是k<ai的前缀和),并且先进行add(将ai之前的技能值全部计算完影响),再进行read(相当于原来按1~n顺序创建树状数组一样,先往右上创建树状数组,再左上计算前缀,以至于可以边add边read而不会有错误)。这里的预处理与模板上直接处理不同,这里需要边add边read,略带递推的思想。

上一篇下一篇

猜你喜欢

热点阅读