省赛训练小记

记录一下这一个周做的一些题

  • HDU7146 枚举不在同一斜线/横线/竖线的两个点,然后暴力枚举这两个点所在直线的类型,求出交点就是中心点,判断是否合法即可

  • HDU7175 先跑最短路,得到可能在最短路图上的边构成了一个新图,由于有 0 边因此可能有环,缩点之后在 DAG 上 dp 即可

  • CF1746C & CF1656D 签到

  • HDU7214 枚举这个数字有多少次出现,然后只需要求出此时的方案数。设 \(dp_{i,j,0/1,0/1}\) 代表考虑到第 \(i\) 位,当前这个数字出现了 \(j\) 次,上界/前导 0,转移是个大讨论

  • GYM103428M 将输赢放到网格上,输往上,赢往右,那么考虑对于每一个输的时候记一个 \(w_i\) 表示这之前连续赢了几次。问题转化为 \(w_1+..+w_{n-m+1}=m\),且 \(\max{w_i}=k\),容斥一下转化为 \(\max{w_i}\leq k\),然后是一个经典子问题:\(y_1+..+y_n=m, 0\leq y_i\leq k\)\((y_1+1)+..+(y_n+1)=(m+n), 1\leq y_i \leq k+1\), 问方案数,这个子问题考虑容斥,每次枚举有 \(p\) 个位置超了 \(k+1\),可以先填一个 \(k+1\) 然后和没事一样继续填数,这样就保证了一定是超了的。显然容斥之后得到了这个子问题的答案:\(\sum_{i=0}^n (-1)^i\times C(n,i)\times C(m+n-1-i*(k+1),n-1)\),带回即可

  • LOJ10159 换根 dp 即可,每次维护以某个点为根的最大/次大深度即可

  • HDU7203 签到题,注意 \(a\) 是固定的,拿个 map 存即可

  • GYM102361D 签到题

  • GYM104337C 如果是 \(n\times n\) 的话显然答案就是 \(n\),否则剩下的 \(k\) 列(行同理)经观察发现这块就是 \(ceil(k/2)\)

  • GYM104337F 考虑 | 两端的回文半径构造即可

  • GYM104337H 将 \(deg_i\) 出现次数根号分治,小的部分用桶,大的暴力,小和大的连接用桶+暴力

  • GYM104337I 即求最小的 \(n\),使得 \(lcm(p_1,...,p_m)|(1+..+n)\),首先可以用质因数分解求出 \(lcm\),然后有 \(2\times lcm|(n\times (n+1))\),由\(n,n+1\) 互质可以发现其包含的质因数都是无交集的,而 1e18 最多有 15 个质因子,因此我们可以枚举哪些质因子对应的是 \(n\) 的,剩下的必然是 \(n+1\) 的。具体的,假设:
    \(n\equiv 0(\mod q_1^{t_1})...\)
    \(n\equiv 0(\mod q_k^{t_k})\)
    同时,有
    \(n\equiv -1(\mod r_1^{s_1})...\)
    \(n\equiv -1(\mod r_p^{s_p})\)
    其中 \(lcm=q_1^{t_1}\times ... \times q_k^{t_k} \times r_1^{s_1} \times... r_p^{s_p}\)
    则显然有 \(K\times q_1^{t_1}\times .. \times q_k^{t_k} = n\),和 \(I \times r_1^{s_1}\times .. \times r_p^{s_p}=(n+1)\)
    化简得 \(I\times ( r_1^{s_1}\times .. \times r_p^{s_p}) - K\times (q_1^{t_1}\times .. \times q_k^{t_k})=1\),将 \(I,K\) 作为变量用扩欧即可

  • GYM104337J 贪心+优先队列

  • GYM104337K dp推导+数学归纳法可得答案是 \((\frac{m-i}{m-1})^n\)

  • GYM104337M 签到题

  • HDU6235 签到题

  • HDU6240 分数规划首先二分答案,转化为 \(A_i-T\times B_i \geq 0\) 的问题,首先将所有小于 0 的部分都加上,因为加上之后答案肯定不劣。然后考虑按照右端点从小到大扫,做 dp,设 \(dp_i\) 表示考虑到第 \(i\) 个时刻的结果,那么对于当前的 \([l,r], a,b\) 来说,答案肯定是 \(min{dp[l-1]..dp[r]}+(a-T\times b)\) 用线段树/树状数组维护即可

  • HDU6231 考虑二分第 \(M\) 大的数 \(p\),那么如果这个数是第 \(M\) 大,令 \(b_i = [a_i\geq p]\),则能推出 \(sum(b[l..r]) \geq k\) 的区间个数不会小于 \(M\) 个,用 two-pointers 解决,注意 \(M\) 可能会爆 int

  • HDU6230 先用 manacher 求出每个点的回文半径,注意到题目给的条件实际上就是 \(i\)\(j\) 为中心的回文串相交且交到 \(i+1\) 处。考虑倒序扫一遍,每次扫到 \(j\) 为中心的回文串时,就将 \(j-R[j]+1\) 加上1,每次只需要统计 \(1..i\) 中有多少个 1,就代表了能和多少个回文串构成题目所求的回文串,用树状数组维护这个过程

  • HDU6241 二分答案,那么第二个条件可以变成子树内的特殊点应该 <=,可以树形 dp 记一下每次的最小值 & 最大值,然后和这个点对应的限制条件比一下。注意要判一下总共选的个数区间是否包含二分时的答案

  • HDU6242 傻逼题。每次随机三个点,由于题目中保证了存在圆使得包含一半结点,随机次数不会很多。被精度卡爆,不能开 long double,eps 要开到 1e-3.....

posted @ 2023-05-06 23:37  SkyRainWind  阅读(25)  评论(0编辑  收藏  举报