NOIP复习(总结套路)


开始复习,把u盘现存和noip历年题速刷,写题解,总结套路。以下总结考试经验,解题套路,思维套路

  1. 矩阵乘法,高精度等之类的结构体重载运算符的变量要用const type &x
   inline matrix operator * (const matrix &x,const matrix &y) {
	matrix c;
	c.n = x.n;
	c.m = y.m;
	
	rep(k, 1, x.m)
	rep(i, 1, c.n)
	rep(j, 1, c.m)
	c.a[i][j] = (c.a[i][j] + 1ll *  x.a[i][k] * y.a[k][j] % mod) % mod;
	return c;
}

c是定义在函数里面的矩阵,有个数组,记得初始化!
循环KIJ更快,访问连续内存
3. 01字典树取出x的第j位要这样写 (x>>i)&1 ,不能写成((x&(1<>i),会爆int
4.一定要多多面向部分分编程
5.像map,set这种不支持随机访问的不要用lower_bound(s.begin(),s.end(),x),这样是暴力的。。 要用 s.lower_bound(x);
6.int向上取整要这样写

if (temp%k == 0)
    result = temp / k ;
else
    result = (temp / k)+1;

7.不开longlong见祖宗
8.

for(int i = head[u]; i; i = nxt[i]) {
    if(to[i] == fa)continue;
    dfs(to[i], u);
    sz[u] += sz[to[i]];
    for(int j = sz[u]; j >= 0; j--) {
        for(int k = 1; k <= min(j, sz[to[i]]); k++) {
            dp[u][j] = max(dp[u][j], dp[u][j - k] + dp[to[i]][k]);
        }
    }
}

这样计算会大量重复计算,遇到链会卡成三方,下面那种保证点对都在LCA处计算,保证时间复杂度为而二方

for(int i = head[u]; i; i = nxt[i]) {
    if(to[i] == fa)continue;
    dfs(to[i], u);
    for(int j = sz[u]; j >= 0; j--) {
        for(int k = 1; k <= sz[to[i]]; k++) {
            dp[u][j + k] = max(dp[u][j + k], dp[u][j] + dp[to[i]][k]);
        }
    }
    sz[u] += sz[to[i]];
}

9.板子一定要熟,特别是数据结构,不能打错,慢慢打。tarjan的板子(dfn,low,各种要求的(割点割边等)的判定方法)!
10.函数前面一定要有定义类型,非void函数一定要有返回值,等于号不要打成赋值号
11.注意看警告!
12.如果题目有个操作,让你对个数字进行操作,次数很大,上1e9的,多半是倍增,矩阵快速幂
13.边权都是1/0的可以用双端队列bfs O(n)求最短路,1的放后面。0的放前面