题意:n头牛,1~n的id给它们乱序编号,已知每头牛前面有多少头牛的编号是比它小的,求原来乱序的编号
分析:从后往前考虑,最后一头牛a[i] = 0,那么它的编号为第a[i] + 1编号:为1,倒数第二头牛的编号为除去最后一头牛的编号后的第a[i-1] + 1编号:为3,其他的类推,所以可以维护之前已经选掉的编号,求第k大的数字,sum[rt] 表示该区间已经被选掉的点的个数。另外树状数组也可以做,只不过用二分优化查找第k大的位置。
收获:逆向思维,求动态第K大
代码(线段树):
/************************************************* Author :Running_Time* Created Time :2015/9/9 星期三 17:01:08* File Name :P.cpp ************************************************/#include #include #include #include #include #include #include #include #include #include #include #include #include
代码(树状数组):
/************************************************* Author :Running_Time* Created Time :2015/9/9 星期三 18:19:28* File Name :P_BIT.cpp ************************************************/#include #include #include #include #include #include #include #include #include #include #include #include #include