高精度乘法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
vector<int> mul(vector<int> &A, int b)
{
    vector<int> C;

    int t = 0;
    for (int i = 0; i < A.size() || t; i ++)
    {
        if (i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();

    return C;
}

a为倒叙大数

二分搜索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int bs1(int x, int a[], int len){
    int l = 1, r = len - 1, mid;
    while (l < r)//>=x最小
    {
        mid = (l + r) >> 1;
        if(a[mid] >= x) r = mid;
        else l = mid + 1;
    }
    if(x != a[l])return -1;
    return l;
    
}

int bs2(int x,int a[], int len){
    int l = 0, r = len - 1, mid;
    while (l < r)
    {
        mid = (l + r + 1) >> 1;
        if(a[mid] <= x) l = mid;//<=x最大
        else r = mid - 1;
    }
    if(x != a[l])return -1;
    return l;
}

在队列严格单调时无影响,有重复元素时候有区别

快速幂

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
int quickPower(int a, int b)//是求a的b次方
{
	int ans = 1, base = a;//ans为答案,base为a^(2^n)
	while(b > 0)//b是一个变化的二进制数,如果还没有用完
    {
		if(b & 1)//判断b最后一位是不是1:
			ans *= base;//把ans乘上对应的a^(2^n)
		
        base *= base;//base自乘,由a^(2^n)变成a^(2^(n+1))
		b >>= 1;//位运算,b右移一位
	}
	return ans;
}

BFS

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
queue<type> q;
q.push(init);
while(!q.empty()){
    type u = q.front();
    q.pop();
    //取队首然后弹出
    for(枚举){
        if(valid){
            q.push();
        }
    }
}

邻接表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
struct edge{
	int to,cost;
};
vector<edge> p;
int degree[num];

void add(int a, int b){
    degree[b] ++;
    p[a].push_back(b);
}

链表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
struct stu{
	int num,score;
	stu* next;
};

int main(){
	stu* head = NULL,* p1,* p2;
	p1 = (stu*)malloc(sizeof(stu));
	p1 ->next = NULL;
	scanf("%d%d",&p1->num,&p1->score);
	while(p1 -> num != 0){
		if(head != NULL){
			p2->next = p1;
		}else{
			head = p1;
		}
		p2 = p1;
		p1 = (stu*)malloc(sizeof(stu));
		scanf("%d%d",&p1->num,&p1->score);
		p1 ->next = NULL;
	}
	
	stu *p = head;
	while(p != NULL){
		printf("%d %d\n",p->num,p->score);
		p = p ->next;
	}	
	return 0;	
}