[置顶] 各种有用的东西、黑科技、技巧

转自WerKeyTom_FTD的blog
1、整体二分及cdq分治实现时,每个区间不需要单独开队列。可以把操作弄到一个数组了,然后多两个参u、v表示这个区间的操作在u~v,做完后对每个操作打标记表示是否往右区间传即可。
2、两个long long相乘取模怎么办?
第一种是快速乘,类似快速幂,复杂度多了个log
第二种是找一个比较小的数,然后搞一波,详见代码

ll qsc(ll x,ll y){
    ll a1=x/1000000,a2=x%1000000,b1=y/1000000,b2=y%1000000;
    ll t=a1*b1%p*1000000%p*1000000%p;
    t=(t+a2*b2%p);
    t=(t+a1*b2%p*1000000%p);
    t=(t+a2*b1%p*1000000%p);
    return t%p;
}

第三种来自Yves___的博客long long相乘取模黑科技

LL mult( LL A, LL B, LL Mo )
{
    LL temp = ( ( LL ) ( ( db ) A*B/Mo+1e-6 ) * Mo );
    return A*B - temp;
}

大概意思就是强制转double然后搞一波再转回来。
3、unique()可以删除重复元素,然后返回删除重复元素后的末端地址。
下面这段代码即可实现离散化。

fo(i,1,n) scanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+n+1);
l=unique(b+1,b+n+1)-b-1;
fo(i,1,n) a[i]=lower_bound(b+1,b+l+1,a[i])-b;

4、可以用调用ctime,运用clock()获取程序运行至该语句时的时间(默认ms)

#include<iostream>
#include<ctime>
using namespace std;
int main()
{
    int n=0;
    //start=clock();
    while(n<100000000)
        n++;
    cout<<(double)clock()<<endl;
    return 0;
}

你可能感兴趣的:(cdq分治,乘法取模,c++黑科技)