虽然考试时数据太水了,不过这个题目本身还是很有分析价值的
题目大意:
给你四次考试的排名(4个序列),若一个选手存在另一个选手在四次排名中的至少三次在他之前,那么我们就说这个选手不是完美的选手,要求统计完美选手的个数,n<=100000
分析:
n平方的朴素显然是过不了的,那么我们稍作分析,就可以得到这样一个想法,把每个人某3次考试的排名抽象为一个3维空间内的点,若原点到i号人的长方体空间内有一个点,即存在j,使得a[j]<a[i],b[j]<b[i],c[j]<c[i],a,b,c表示这三次考试的排名,那么i号人就不是完美选手了。有了这个想法,我们就可以搞个三维树状数组统计。。。当然,这也是过不了的(空间!),所以,降维成为问题的关键,继续分析
原问题有4维,首先考虑到每次只管3门就可以了,所以枚举不管的那门,降掉一维;假设剩下a、b、c三门成绩,给a排个序,顺序扫描时降掉一维;再把b[i]插到树状数组中,每个节点维护min{c[i]}(由于实际上我们只关心存不存在排名比i考前的人,并不关心个数),最后对每个点i,比较min{c[j]}和c[i]即可判断这个人是否为完美选手了,复杂度O(nlogn)
代码就略了吧
这道题用到的思想非常有意思,值得参考。那个树状数组xqz用的是平衡树,结果也过了,不过因为常数较大吧,比我的树状数组慢了一倍