2021.08.17【USACO】模拟赛 赛后总结

前言  

        这次比赛考得也非常差,19分,57名。T2提交错了,不然我可以16名。 应得:T1WA5,T2TLE46.2,T3WA0,T4WA6.3。实得:T1WA5,T2WA0,T3WA7.7,T4WA6.3。 


T1 Dance Mooves

题目大意       

        有n个点,每个点上都有一只牛,这些牛会无限交换k次。问这些牛最多能到多少个位置。

正解

        这道题用图论。     

        用 p_{i} 表示 i交换k次后到达的点。我们把ip_{i}连一条有向边,则构成了一个有很多环的图。        

        我们模拟交换k次,把i到过的点作为边权放在边(i,p_{i})上。则每个环里面全部点的答案为环的边上经过的点的数量。

        我们用类似边集数组的链表存储边权。在另一个图里把i和每个i经过的点连一条有向边,则访问每个边权可以这样:

for i=last[x] i!=0 i=next[i]

这样就能解决空间问题。

赛时情况

比赛时我不会做,打表骗到5。​


T2 No Time to Paint

题目大意  

        给你一个字符串s,要你构造s。你可以把一段区间变成同一个字符。问你在不动区间(l,r)的情况下,构造s的最小步数。

正解

        这道题我们先预处理出两个数组f[]和g[]。f[i]表示涂钱i个栅栏最小需要的时间,g[i]表示涂前j个栅栏需要的最小时间,询问l和r则是f[l-1]+g[r+1]。        

        难点就是预处理。我们先看f。我们设一个位置桶h[s[i]]表示s[i]出现的最后一个位置。这样就有两种情况需要讨论:
1.如果s[i]是第一次出现,那么就要多涂一次。
2.如果s[i]不是第一次出现,那么就要判断区间(h[s[i]],i)内有没有比s[i]小的字符了。要枚举字符,不能枚举区间,不然会TLE。adj表示区间内有没有更小的字符。

        g也同理,只不过反着来罢了。

赛时情况       

        我想用区间DP,结果提交错代码,WA0。

T3 Spaced Out

题目大意       

        有一个边长为n的方阵,每个格子里有一个数。你要在这个方阵里选出一些格子,满足每个边长为2的子方阵里必须有两个格子被选中。问能选的最大值是多少。

正解

        分类讨论。讨论出每种情况。
        我们先讨论第一行。用1表示选,0表示不选,第一行有一种特殊情况:
10101010101010101010
        这种情况时,第二行可以有两种情况:
1.照抄
10101010101010101010
2.反着来
01010101010101010101
        因此我们发现,不管前一行选什么,这一行都有两种情况,不影响其他行。
        而其他情况,第二行只能反着来。因此我们发现,它其实也是第一种情况,只不过第一种情况按行来,其他情况按列来。每一列都是1010101010101……的结构。

赛时情况     

        我想着用动规,结果错了,WA7.7。


T4 Uddered but not Herd
题目大意

        给你一个字符串,构造一个a到z的排列 。 选择多个s的子序列,然后用最少的子序列个数覆盖这个字符串。

正解

        这道题用状压DP。

        我们先把字符串中每个字符在正常字典中的位置求出来。

赛时情况        

        我用奇葩算法骗了6.3分。


总结

这次比赛有两个问题:
        1.把简单的题想复杂了。
        2.放弃简单的去做难得。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值