44 萌新寒假作业八 C题 逆序数 思维

CF 911D

要求:从1到n共n个不同的数组成一个排列,左端点l和右端点r确定的区间内的数字进行
反转,若反转后逆序数为偶数,输出even,否则输出odd。
反转:       排列1 2 3 4 5
l=2,r=4,反转后 1 4 3 2 5。
l=2,r=5,反转后 1 5 4 3 2。
逆序数:若第i个位置的数字大于第j个位置的数字且i<j,则逆序数加1.
2 4 3 1 5 
4 之前有0个
3 之前有1个
1 之前有3个
5 之前有0个
所以逆序数就是1+3=4。
方法:思维。
1.先统计最初的逆序数sum。
2.区间[l,r]的长度为len,区间内包括len*(len-1)/2个数对,将[l,r]内数字反转后,
逆序数对num,正序数对len*(len-1)/2-num,反转后的正序数对反转前是逆序数对,
故反转前后逆序数对相差num-(len*(len-1)/2-num)=2*num-len*(len-1)/2,2*num为偶数,
则相差逆序数对数为len*(len-1)/2,若对数为偶数,flag取反,否则flag不取反。
3.因每次判断的是区间长度,故无需对序列进行反转,只改变flag的值即可。
4.若flag=1,输出even,flag=0,输出odd。
 

猜你喜欢

转载自blog.csdn.net/irving0323/article/details/81194987