A.平面
这是道好题,考验的是我们的数学能力。
我们可以把X分成两条直线,这不就转化为了n条互不相交直线最多能把平面分成多少部分。
我们知道一个公式:n*(n+1)/2
时间复杂度O(1)
1 |
|
B.烟花
好题,中等难度。
我一看题目就知道这是道期望dp题。
对于第1个问题,f[i]表示前i个烟花产生颜色的期望。
1 | for(int i=1;i<=n;i++) |
对于第2个问题,g[i][j]表示前i个烟花产生j种颜色的概率。(注意要滚存)
1 | g[0]=(1-p[1]);g[1]=p[1]; |
时间复杂度:O(n*k)
全部代码:
1 |
|
C.城市规划
这题卡了我好久,我还以为可以用监视任务这题的方法,用线段树+贪心做。
但调了好久发现会T(m竟然=1e7)
这题由于只要区间>=1所以,我们就可以用一种简单的方法。
我们发现对于每个右端点,只有最大的左端点有用(想一想为什么)
时间复杂度:O(n)
1 |
|
D. xor序列
这题不是线性基裸题吗。
xor有个性质:a xor b =c 那么 a xor c = b
直接查找 a xor b 是否有,有就YES,否则NO
时间复杂度O(50*n)
1 |
|
E. 树上路径
这题真的难,不仅思维上难,代码实现上很难(这是我们学校的一场模拟赛的一道题,我现场A了)。
这题一看就是要用树链剖分,关键是如何维护(u, v)路径上节点的权值两两相乘的和 。
我们记一个sum数组表示和,在记一个mul数组记录两两相乘的和。
我们发现如果l-r这段区间集体+val,那么
1 | tree[nod].mul=(tree[nod].mul+(r-l)*tree[nod].sum%p*val%p+(val*val)%p*jc[r-l]%p)%p; |
jc[i]=sigema(1-i)
所以这题就这么愉快的解决了
1 |
|
时间复杂度:O(n log(n)*log(n))