日常刷题 无代码(长期更新

codeforces

  • 1401F 线段树题 我们可以考虑为反转 子树
  • 1579g 可以二分 因为会有负数 所以我会把 开始的位置 为 0-mid 然后dp
  • 459e 边权从小到大加入 没有后效性 直接dp
  • 372b 前缀和
  • 1151e 点=边+连通块 见了两次了 这下记住了
  • 505C 直接dp复杂度不对 我们优化一下 dp[i][j] 表示目前到了i 和d偏移了j的总权值
    因为j有可能小于0 所以我们把原点改一下
  • 1109b 大力分类讨论 注意偶数 回文串要递归讨论
    或者直接暴力
  • 1527e
    dp[i][j]=max(dp[k][j-1]+val(k+1,i));
    前i个数分为j段的最大值
    维护每个数前一次出现的位置
    滚动优化一维 更新的时候 (0,la[a[i]]-1)都加上 i-last[a[i]]
    然后线段树查询 (0,i-1)最大值即可
  • 1324f
    黑点权值赋值为-1 先统计出1号点的答案 然后转移的时候
    如果dp[v]>0 dp[v]=max(dp[v],dp[u]) 否则 dp[v]=max(dp[v],dp[u]+dp[v])
  • 1209d
    转化为连通块数量即可
  • 1304e
    lca板子只要 询问的距离和他们的距离之间的奇偶性相同即可
  • 1401d
    非常经典的题目 我们只需要考虑每条边会有多少贡献即可
  • 346 b kmp优化dp lcs的加强版
  • 817d 单调栈 统计出每个数字向左向右的最大最小值 主要是会有相同的数 所以左开右闭或
    者左闭右开即可
  • 710e 考虑到每个状态虽然可能由后面转移过来 其实都是可以和前面的某些状态等价的
    0 dp[i]=min(dp[i-1]+x,dp[i/2]+y)
    1 dp[i]=min(dp[i-1]+x,dp[(i+1)/2]+x+y)
  • 1343e 先bfs 或者dij 跑出最短路 然后枚举中间点贪心

牛客

  • 智乃酱的子树查询类问题-: 将询问离线 用动态开点权值线段树维护
    考虑长链剖分 +线段树 multiset 维护同一深度的点
  • DongDong数颜色 : dsu板子题 或者线段树合并
  • 小 Q 与树 : 树链剖分喵喵题 我们按照权值从大到小排序 简化一下式子发现最难维护的
    是加入的点 和所有的点的lca dep之和 其实有个tag就是 每次加入的时候1-u
    全部+1 然后查询1 -x 的权值和就行了 很经典
  • 小睿睿的伤害 :
    dsu on tree 预处理出每个结点的所有因子 暴力合并
    首先处理 该节点与重儿子的关系 然后将该结点贡献加入 然后处理轻儿子
  • 旗鼓相当的对手 :
    长链剖分 on ans[u]+=cnt[l[u]+K-k]sum[x]+cnt[x]sum[l[u]+K-k];
    dsu on tree 和上一个题做法一样都是维护lca的贡献
    d[a]+d[b]-2
    d[t]=k
    d[a]=2
    d[t]+k-d[b]

atc

你可能感兴趣的:(算法,c++)