各种有用的东西、黑科技、技巧

转自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
#include
using namespace std;
int main()
{
    int n=0;
    //start=clock();
    while(n<100000000)
        n++;
    cout<<(double)clock()<return 0;
}

5、调用头文件bits/stdc++.h就相当于包括了好多库……
6、如何打伪随机数?

int rand() {
    static int rand_seed=1542071823;
    rand_seed+=rand_seed<<1|1;
    return rand_seed;
}

7、对拍(从前一直用c++对拍的蒟蒻就是他(还有我本人))
在程序的目录下建立.txt文件,输入:

@echo off
:loop
data.exe //生成数据
right.exe //要对拍的
brute_force.exe //暴力
fc data1.out data2.out //两个程序的输出文件
if not errorlevel 1 goto loop
pause
goto loop

把文件扩展名名改成.bat
8、关于可持久化,记住以下几点:
1:一个点的信息要被修改时需要对其新建。
为了节省空间,一个点的信息不被修改时就没必要新建了。
例如合并一个结点与空节点,此时不需要新建。
2:为了节省空间,如果对空节点进行newnode我们直接返回空节点。
3:打标记也涉及修改信息,不要忘记newnode。而down的时候其实并不用,因为修改的是儿子的信息。
9、从OJ上看来一句话,不知道来源。
OI比赛的题目无非三种,从暴力到优化,从一般到特殊,重新定义题目。
10、O(n)求出1~n对于质数MOD的逆元。
来自链接
inv[i] = ( MOD - MOD / i ) * inv[MOD%i] % MOD
证明:
设t = MOD / i , k = MOD % i
则有 t * i + k == 0 % MOD
有 -t * i == k % MOD
两边同时除以ik得到
-t * inv[k] == inv[i] % MOD

inv[i] == -MOD / i * inv[MOD%i]

inv[i] == ( MOD - MOD / i) * inv[MOD%i]
证毕

你可能感兴趣的:(心情,总结,学习小记,模板)