(1)、求n次多项式的幂P^k(x)
正常的多项式快速幂:(假设最后需要mod x^lim)
1、快速幂+FFT/NTT优化乘法:O(lim*loglim*logk)
2、P^k(x)=exp(k*lnP(x)):O(lim*loglim)
3、对多项式分两种方法求导之后比较系数(在n很小的情况下使用):O(lim*n)
(2)、带花树
占坑代填
(3)、可删除的线性基(离线)
先预处理出每个点的删除时间(可能会有一些细节问题)
加入线性基的时候就交换换掉线性基中当前位的删除时间比它先的点
删除的时候就直接找到对应时间的线性基上的某一位(可能不存在,因为它可能被其他数组合出来,也有可能被删除时间更靠后的替换了),直接删掉就好了
代码:
int bas[35],id[35],cnt;
void add(int x,int pos)
{
for(int i=n-1;i>=0;i--){
if(x&(1<<i)){
if(!bas[i]){bas[i]=x;id[i]=pos;cnt++;return;}
else{
if(id[i]<pos)swap(x,bas[i]),swap(pos,id[i]);
x^=bas[i];
}
}
}
}
void del(int pos)
{
for(int i=n-1;i>=0;i--){
if(id[i]==pos){
bas[i]=id[i]=0;cnt--;
return;
}
}
}
(4)、善于找到贡献单位
到底是谁对答案产生了贡献,比如求子集gcd的积
一些看似很难计算的某种方案的价值,可以通过对每一个点的贡献的拆分来计算它
思维不要僵化
(5)、数值分治
实际上就是一个分类讨论,在根号平衡的时候灵活一点就行了
还是思维不要僵化
(6)、prufer序列
如果只限制一个点的度数可以用组合数直接计算
由于有一个组合数和一个次方,我们甚至还可以联想到二项式定理
限制每个点的度数就可以DP:https://blog.csdn.net/C20180602_csq/article/details/103518193
(7)、基数排序
20200504C
20200505B
这两道排序神题实际上都是通过构造基数排序的权值来做的
20200504C
对每个值构造一个权值数组
如:
0 1 2 3 4 >> 0 4 2 3 1 >> 0 1 2 2 1(大于n/2用它本身减去n)
0 1 2 3 4 5 >> 0 4 2 3 1 5 >> 0 1 2 2 1 0
0 1 2 3 4 5 6 >> 0 4 2 6 1 5 3 >> 0 3 2 1 1 2 3
0 1 2 3 4 5 6 7 >> 0 4 2 6 1 5 3 7 >> 0 3 2 1 1 2 3 0
然后比较这个通过权值数组来进行基数排序即可
20200505B
如:p: 8 3 2 1 4 5 7 6
我们需要把极长的连续的自然数段划分出来,把同一段的元素看为一个整体,从小到大给一个段赋上新的权值,则问题就转化为给一些整段进行基数排序
8 3 2 1 4 5 7 6
8
3 4 5 6
2
1
7
对于划分,我们不能O(n^2)来操作(其实可以直接O(nlogn)排一下序就可以了)
但是有更简单的方法
考虑到置换的一一对应以及值域很小的性质
略加思考,我们可以求出q=p^-1,即p的逆置换,而逆置换q[i]就表示,数i位于p数组中的第q[i]位
直接O(n)扫一遍q数组即可完成分段
(8)、巧用放缩思想
求一个符合条件的答案时我们不用一来就求准确的答案,我们可以先求一个比较宽松的范围,然后在来求精确的答案
(9)、序列自动机
(10)、期望概率题
我们一般可以先算概率再对每一个概率分别来计算贡献
(11)、循环卷积
字面意思
for(int i=0;i<d;i++)
for(int j=0;j<d;j++)
ans.f[(i+j)%d]+=f[i]*t.f[j];
其实FFT做的就是循环卷积,所以以后应该可以用FFT优化循环卷积
(12)、关于图论
注意对图的性质的深度挖掘
这个……东西……千变万化……吧
我也总结不出什么像样的套路………………