好难啊。
改的也好难。
T1
联赛题。
我们发现(k)次冒泡排序之后,一个元素最多向左走(k)步。
那么对于(forall iin[1,k+1])维护(a[i])的最小值。
那么排序后的(a'[1])为这段的最小值。
然后维护([1,k+2])的,这些的最小值是(a'[2])的值。
以此类推。
T2
想到了用行列式。
但是还是不会维护。
我们发现只需要求这样一个满足条件的矩阵:
[forall i,jin[L_i,R_i],a_{i,j}=1
]
的行列式。
如果是正数那么我们就赢了。
0的话平局。
负数就是魔鬼赢了。
那么暴力的求是(n^3logn)的。
我们利用这个矩阵的特殊性质用线段树合并来维护一下。
按照右端点排序。
每一行找到(r)最小的且当前位为(i)的行。
然后交换行。
消除的时候,把一行的所有信息都转移到(R_i+1)处去。
这样做一次是(O(nlog^2n))的。
T3
多项式题。
我们把大于(10000)的所有数都统一统计,发现他们的代价全都是关于(gcd({A_i}))循环的。
那么我们求出这个多项式关于(gcd)的循环卷积快速幂:((px+100-p)^n)即可统计了。
然后小于(10000)的部分去掉统一统计时候的答案,然后暴力背包算出来这一部分的贡献即可。