CSUST 2021银川选拔塞

CSUST 2021银川选拔赛

  • A、查询区间众数出现次数
  • B、PC玩游戏
  • C、PC买礼物
  • D、game
  • E、median
  • F、重建网络
  • G、最大得分
  • H、PC要出题

良心场,jio得应该会有人ak。
其中H题题面是真情流露,某PC能不能别拖了。

A、查询区间众数出现次数

莫队的板子题,不多赘述。(建议直接百度题名,看其他巨佬博客)

B、PC玩游戏

(CF1700分的题 为啥没人写)
解法一:二分答案。
解法二:set容器,把每次查询当成一次插入操作,维护可以存放的玩偶数量。

C、PC买礼物

DAG上dp

d p [ i ] [ j ] dp[i][j] dp[i][j] 表示在第 i i i间店,花了 j j j元钱的方案数
设有 ( u , v ) (u,v) (u,v)这条单向边,则 d p [ v ] [ j ] = d p [ v ] [ j ] + d p [ u ] [ j ] + d p [ u ] [ j − w i ] dp[v][j] = dp[v][j] + dp[u][j] + dp[u][j - w_i] dp[v][j]=dp[v][j]+dp[u][j]+dp[u][jwi]
因为无环,且所有边都满足 u < v uu<v,按序号从小到大dp就行。

D、game

签到题,无论如何整个图最后都能被走完,判断奇偶就行

E、median

题意:给你一个 [ 1 , n ] [1,n] [1,n]的排列,有多少个长度为奇数的连续子序列满足中位数是 v v v

因为长度是奇数,就保证了 v v v必须是连续子序列从小到大排序后处于中间的数。
即我们只要满足在子序列中,比 v v v小的个数等于比 v v v大的个数,并且有 v v v存在。
预处理将所有比 v v v小的数改为 − 1 -1 1,比 v v v大的数改为 1 1 1,把 v v v改为0,并标记位置为 p o s pos pos
转化为求有多少经过pos的奇数长度区间,其和为 0 0 0
利用前缀和就可以解决本题

F、重建网络

贪心+最大生成树

本题要让最小边权等于 k k k,可以先跑最大生成树。
如果最大生成树中出现比 k k k小的数,则对于每个比 k k k小的数都计算贡献。
若未出现,则答案为 m i n ( a b s ( k − w i ) ) min(abs(k - w_i)) min(abs(kwi))

解释未出现的情况:
给你一颗树和一条 ( u , v ) (u,v) (u,v)边,你可以从树上将 ( f a [ u ] , u ) (fa[u],u) (fa[u],u)边替换,这样保证替换后,仍然是一颗树。
因此我们得到最大生成树后将边权最接近k的直接替换进树就行。

G、最大得分

三维dp (可滚动数组)

d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k] 表示第 i i i个数,当前部分的 g c d gcd gcd j j j,已经分到第 k k k部分了
g = g c d ( j , a [ i ] ) g = gcd(j,a[i]) g=gcd(j,a[i])
d p [ i ] [ g ] [ k ] = m a x ( d p [ i ] [ g ] [ k ] , d p [ i − 1 ] [ j ] [ k ] ) dp[i][g][k] = max(dp[i][g][k],dp[i - 1][j][k]) dp[i][g][k]=max(dp[i][g][k],dp[i1][j][k]) 即仍然放在第k部分
d p [ i ] [ a i ] [ k ] = m a x ( d p [ i ] [ a i ] [ k ] , d p [ i − 1 ] [ j ] [ k − 1 ] ) dp[i][a_i][k] = max(dp[i][a_i][k],dp[i - 1][j][k - 1]) dp[i][ai][k]=max(dp[i][ai][k],dp[i1][j][k1]) 即放在新的部分
(注意减少gcd的使用次数,否则可能会T 或者 预处理也行)

H、PC要出题

思维签到题

s u m [ i ] sum[i] sum[i] 表示数字 i i i出现个数

a i a_i ai取模后得到 v v v
ans = ans + sum[(k - v) % k] (注意这个%k,漏了就会wa)
然后更新 s u m [ v ] sum[v] sum[v]

你可能感兴趣的:(ACM,acm竞赛)