提交地址: https://www.icpc-camp.org/contests/4rgOTH2MbOau7Z
题意:
给出一个整数数组,F[i]定义为以i结尾的最长上升子序列,然后问以此删除掉第i个数后F[1]^2 xor f[3]^2 xor .. xor F[n]^2 , 当然不会算删除的那个。 n <= 5000
思路:
比赛的时候看完了觉得是个傻逼题,觉得n^2logn能够跑过不知道为啥这么少人交,然后兴致冲冲的敲了一发返回T才意识到没那么简单,题目是把log给卡了的,然后n^2肯定是能过的,不过一直也没有思路,然后赛后听了题解,也不是很懂,也是最近才有时间想起来这个题目的。
感觉没有思路是因为没有真正的理解LIS的原理,以前都是一直套的板子,所以不是很懂。然后补的时候仔细想了下,就是把v[i]当做以LIS长度为i结尾最小值,然后形成一个单调的队列,就可以使用二分查找到当前的值应该在v数组的哪个位置进而求得以a[i]结尾的LIS,然后更新当前的v[a[i]]数组。然后这个题目呢感觉就是挖掘这个本质,也是这道题让我懂了LIS的原理,因为删除了一个数,那么当前数的LIS值肯定是在原LIS值或者原LIS-1,所以我们就不需要二分去查找当前值应该属于哪个位置了,加入当前数的原LIS值为b我们只需要判断v[b]是否小于a[i],如果不是那v[b-1]肯定小于a[i],然后就降低了一个log。
代码:
/** @xigua */#include #include #include #include #include #include #include #include #include #include #include