codeforces gym
远古时期的区域赛,前8道题都比较无聊,熟练换根DP可直接虚空夺冠.
A. 签到.
I. 签到.
D. 试图用组合数和容斥原理计算,精度直接爆炸.合理的做法是用(DP[i][j][k])表示第(i)天恰有(j)行和(k)列被支配的概率.转移时需要先算加法再算除法,否则会有精度问题.复杂度(O(N^2M^2)).
K. 合法的情况为:1.纯数字;2.将数字记为(1),星号记为(-1),任意前缀和需大于等于(1),且末尾为星号.只考虑第(2)种情况,首先在前面补足数字使得和大于等于(1),然后贪心交换最前面星号和最后面数字直到合法.复杂度(O(|s|^2)).
B. 枚举去掉每条边后,两棵子树直径一半(上取整)的较大值.换根DP,在每个点记录子树中最长路和以该点为起点的最长路.复杂度(O(N)).
H. 模拟.考虑类EON
定义如下:
struct EON{
bool isString;
string value;
map<string, EON*> pairs;
EON(const string& s, int L, int R, const vector<int>& matches);//matches表示括号和引号匹配情况;递归构造函数
EON(const string& s);
void print();//递归输出函数
void get(const string& s);
};
实际上这题代码比较简单.
F. 考虑(f[u][i])表示考虑(u)的子树中(u)取值为(i)的方案数.需要使用莫比乌斯反演进行转移.
转移方程为:(g[u][i]=displaystylesum_{i|j}f[u][j],h[u][i]=sum_{j|i}mu(j)g[u][j],f[u][i]=prod_{v ext{ is son of }u}h[v][i]).
同样需要换根DP,复杂度为(O(nR_maxlog R_max)).
E. 一种构造方案如下:
假设存在(N-2)的方案,并且起点为左上角,终点为左下角.
无论(N)为偶数还是奇数,都存在一条路径,经过所有满足(xle2lor yge N-1)的((x,y)),并且起点为((1,1)),终点为((N,N-1)).(奇偶的路径在右上角有区别).
然后逆时针旋转((N-2))的方案接在上述路径后,此时可以满足起点为左上角,终点为左下角.
GJC. 不会/没看.