2021省选模拟
3.22
x
- 用筛出的质数分解质因数时用 \(n\) 把找到的质因数除掉,\(n=1\) 时
break
;只用到 \(\sqrt n\),剩下的若不为 \(1\) 则一定为大于 \(\sqrt n\) 的质因数(最多一个) - \(n\) 个数分成两组的方案数有 \(2^n\) 种,其中两种有一组为空集。
y
- 图论中若点数少,可以考虑每个点增加一维来维护一些东西
- 答案的两部分可以拼起来时折半搜索
z
3.25
Merchant
- 结论不确定时可以先用小数据试一下再对拍
- 暴力确定会T时宁愿写猜的结论
Equation
- 即使比赛快结束也要镇定
- 如果正解是暴力的优化,先打暴力
Rectangle
NOIO-S
早点交题,避免最后网站崩掉
积木小赛
int
单哈希字符串种类(很多)时冲突概率极大,用 \(10^{14}\) 以上的质数比较靠谱(官方数据水了)
3.27
天空龙
巨神兵
- 若点数极少(\(\le 20\))而边数很多,考虑状压点集,即使问题与边有关
- 一个DAG的拓扑序是一定的
太阳神
- 反演学傻了。。。
3.29
Divisors
Market
- 60pts:类似 P4141 消失之物
- 背包在体积很大而价值很小时可以反转,\(f[i]\) 表示达到 \(i\) 价值的最少代价,但 \(f\) 不具有单调性,因此同时维护 \(g[i]\) 表示达到至少 \(i\) 价值的最少代价,二分求解。
Dash Speed
- 询问的状态比较简单且相互有一定联系时可以预处理出所有可能询问的答案
- 线段树分治不一定要在时间上
- 并查集维护直径
3.30
Reverse
- 边界的考虑要全面,最好多画图
Silhouette
- 即使打暴力也要尽量剪枝,否则小数据都可能会T
Seat
4.6
Graph
- 贪心。注意分类完全
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n,m;
vector<int> to[N];
int dep[N];
struct Node {
int a,b,c;
Node(int a=0,int b=0,int c=0):a(a),b(b),c(c){}
};
vector<Node>ans;
int dfs(int u) {
int x = 0; // x为u的儿子中一个没有用过的
for(int v : to[u]) {
if( !dep[v] ) {
dep[v] = dep[u]+1;
int y = dfs(v); // y为v的儿子中一个没有用过的
if( y ) ans.push_back(Node(u,v,y));
else if( x ) ans.push_back(Node(x,u,v)), x = 0;
else x = v;
} else if( dep[v] > dep[u] ) {
if( x ) ans.push_back(Node(x,u,v)), x = 0;
else x = v;
}
}
return x;
}
int main() {
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; ++i) {
int x,y; scanf("%d%d",&x,&y);
to[x].push_back(y), to[y].push_back(x);
}
for(int i = 1; i <= n; ++i)
if( !dep[i] ) dep[i] = 1, dfs(i);
printf("%u\n",ans.size());
for(Node i : ans) printf("%d %d %d\n",i.a,i.b,i.c);
return 0;
}
Permutation
并没有理解
- 线段树辅助建图(虽然我连建图都没想到)
Tree
忘了怎么转二叉树其实不用边分治- 注意寻找题目的性质,不要只考虑现有解法的优化
4.8
还我信心赛
Median
- 常数极小的话可以 \(O(n)\) 过 \(179424673\)(线性筛出 \(10^7\) 个质数)
Game
- “分数差”是直接作差?!
- 桶!!!
- 寻找题目性质来减少决策集合
- 卡常
Park
- 树上的问题可以考虑以 \(u\) 为中点,把 \(u\) 的祖先和 \(u\) 的子树拼起来
- 注意顺序
分数:
我:72+109+160+180+65+160+103=849
ycx:207+65+160+260+76+180+58=1006