NEU_ACM_预备役练习赛_01——2011_日本_icpc_网络邀请赛
A:数论,筛法
八说了,埃氏筛,欧拉筛。
前缀和,暴力查询就行了。
B:栈
合法括号序列,没什么要说的。
C:并查集,搜索,暴力
对矩形内与坐标(1,1)连通块改变5次颜色,求能获得(1,1)连通块的最大值。
对于矩形内的每一个连通块,我们使用并查集维护。
对坐标(1,1)的连通块,我们暴力枚举可能出现的每一种颜色,并且更新矩阵内连通块的信息。
最后求出(1,1)坐标连通块最大值。
注意在更新并查集信息时,只需要搜索一种状态,不然常数过大会T()
对于连通块点的数量,我们可以在$$O\left( 1 \right)$$查询。也算是一个小优化八。
node find(int x, int y) { node t; if (e[x][y].x != x || e[x][y].y != y) t = find(e[x][y].x, e[x][y].y), e[x][y] = find(t.x, t.y); return e[x][y]; }//找到并查集祖宗节点
void update() { for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) e[i][j].x = i, e[i][j].y = j; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { for (int k = 1; k <=2; ++k) { int tx = i + v[k], ty = j + vv[k]; node tmp = find(tx, ty), t = find(i, j); if (check(tx, ty) && mp[tmp.x][tmp.y] == mp[t.x][t.y]) { e[tmp.x][tmp.y] = t; } } } } }//更新并查集信息
D:状态压缩,搜索,拓扑,剪枝,记忆化搜索(状压dp可能性存疑)
八会,补题
E:
八会,补题
F:
八会,补题
G:做n*m次BFS
八会,补题