1.火柴排队(洛谷P1966)
1.逆序对的求法之一——归并排序
模板:
void msort(int l,int r){
if(l==r) return;
int mid=(l+r)/2;
msort(l,mid);
msort(mid+1,r);
int i=l,j=mid+1,k=l;
while (i<=mid&&j<=r){
if(c[i]>c[j]) {
ans=(ans+1ll*(mid-i+1))%mod; //一般逆序对数量都会超int,注意用long long
temp[k++]=c[j++];
}
else temp[k++]=c[i++];
}
while (i<=mid) {
temp[k++]=c[i++];
}
while (j<=r){
temp[k++]=c[j++];
}
for(int s=l;s<=r;s++){
c[s]=temp[s];
}
}
2.如何以一个数组为关键字,“排序”另一个数组:
新建一个数组c[maxm]
核心代码c[a[i]]=b[i];
c[i]中不符合c[i]=i的都需要调整。
2.ORXOR(abc197c)
Tip1:数据中n较小时跑暴力!!
Tip2:通过位运算暴力搜索:
可用于如总情况为2的n次幂,即该情况本质可看作每一个是否选择的问题,如
1.集合子集 2.n个数据分成多个连续组(>=1个)(可视为是否在间隙分割)