第十四届蓝桥杯广东省省赛游记+个人题解

蓝桥杯,当然是很蓝的啦

前一天晚上调车debug,搞到一点多钟,结果发现是一个很长的if后面竟然多了一个分号,然后就调了两个多小时,这波身败名裂了。

晚上三点多才睡觉。

第一题、第二题

直接暴力就可以算出结果了,第二题暴力比较拉夸,跑了可能有一分钟才出结果。

寄了第二题,暴力都写错了md。。。

第三题

寻找L~R之间平方差数(z=x^2-y^2)的个数

数论推一下可以发现非平方差数只可能是4n+2的形式(打表也可以找到规律)

然后就把L~R拆成1~R-1~L-1算就结束了

第四题

给一个数字串,选一个区间反转,使得反转后数字更小,求这样的区间的个数

n<=5000

题解

这道题比较有意思

我们可以发现,我们反转的区间能否让数字更小这件事,只与区间内的数字有关

例如某个选取的区间是35452

我们可以比较两头,发现反转后是2……3,比原来的区间大

也就是说,如果一个区间左端的数字比右端的数字大,那么反转后的数肯定会比原来的小

但是,如果两端的数字是相同的,那么我们还得再向内走,比较里面的位数

比如34223,比较两端,发现相同,然后往内走,发现4>2所以合法。

至此,这个题已经解决了一半

剩下一半就是如何快速判断上面的条件(两端的大小)

我们发现,可以枚举串的中点的位置(奇数串和偶数串不一样),再枚举串的半径(从内向外扩展),这样就可以利用上一次半径中比较的结果来判断下一次的比较结果,如果当前的比较结果相同,就继承上一次的比较结果。O(n^2)

就结束了。

代码后面再发。

第五题

一棵N个点的有根树,每个节点有一个颜色(最多M种颜色),统计有多少个这样子树,满足子树中包含每种颜色的节点个数相同。

N<=200000,m<=200000

题解

万万没想到,会有这种题。

首先转换问题,我们发现这个子树需要满足的条件等价于:子树大小%子树中颜色种类==0 && 子树中出现次数最多的颜色的出现次数 == 子树大小/子树中颜色种类

然后就是如何快速维护子树中的这个信息

我们可以发现题目没有修改操作

那么可以考虑一波线段树合并

在每个节点对颜色值域建立一个动态开点线段树,维护两个值,一个是颜色种类(线段树中非0数的个数),另一个是最大值,插入的时候就对应位置加一,再pushup更新信息。

然后在dfs回溯之前把其他分支的线段树合并到siz最大的线段树上,再插入当前节点的颜色,统计信息。可以直接把当前节点的线段树根指针指向siz最大的子树的线段树的根节点。

然后按照前面说的判断当前子树是否满足条件。判完了之后再回溯。

线段树合并竟然可以一遍过编译,会折寿的啊

代码后面会传。

有点卡空间,不知道会不会寄。

当然,感觉蓝桥杯第三个大题放这种东西有点不太合适,或许有更简单的解法只是我SB没有想到……如果有大佬想出来了可以交流交流。

第六题

你tm劈我瓜是吧

给出N个西瓜的重量,对于每个瓜,可以买整个瓜,可以半个瓜(精确的除以2),可以不买

问,最少买多少个半瓜可以达到目标重量M。

N<=30,重量<=1e9

题解(歪解)

这题麻烦之处就是重量的范围太大了,如果小一点说不定还可DP

首先是把M乘以2,把所有的瓜重量都乘以2,等价转换为整数范围的问题,后续使用longlong运算免得爆int

然后是从大到小给瓜排序,先搜整瓜,再搜不买,最后搜半瓜,如果重量超限就返回,或者说如果后面都买整瓜也重量不达标,也返回,最后再加一个最优化剪枝。

感觉过不了,不过代码挺短的

第七题

n个点m条边的带权无向图,Q个询问

定义一条路径的瓶颈边为边权最小的边

定义两个点之间的瓶颈边为两点之间所有路径中的瓶颈边的最大值。

每次询问两个点之间的瓶颈边的权值。

n<=100000,m<=忘了,反正数量级差不多,Q<=也忘了,不过我全开的600000,问题不大(

题解

这题过分了,怎么能拿OI板题来考人,欺负别人没学过OI吗??

开始还想了想二分枚举建图,整体二分,线段树分支,后来发现是自己SB了。

没什么好说的,建立Kruskal最大生成树,先并查集判断,然后倍增LCA查询。最后四十分钟才开始写真的很刺激。

中途写了几个nt错误,调了可能十分钟。最后10分钟终于过了。

代码后面传。希望没写挂吧。

第八题

给一个长度为N的数组a[]

求这个数组中所有区间的异或和的和

N<=100000,0<=ai<=2^20

题解

比较好做的题目

首先是拆位,注意这个2^20次方是小于等于,所以一共有21位

然后就是对01序列求异或和

先求一遍前缀异或和,统计前缀异或和中1的个数

然后枚举起始端点,计算后面的前缀异或和中1和0的个数会发生的改变,然后累加1的个数

最后用统计出来的1的个数乘上当前枚举位的权值再求和就是答案了

代码之后传。记得开longlong

第九题

一个二维01矩阵,每一个位置都统计一下相邻九宫格的1的个数作为矩阵A,现在给出矩阵A的一部分,需要反推出原来的01矩阵,保证有解且有唯一解。

题解

因为有解且有唯一解,说明我们需要搜索的无效状态其实很少

那就爆搜剪枝,边填边判断是否合法,填1之前判断是否非法,搜到直接退,然后就没有然后了

代码有点长,调了30分钟左右。

第十题

一个长度为N的01序列,初始状态第一位为0,其他都是1

定义一次操作为选择一个x,把位置为x的倍数的01符号反转。

问最少操作多少次可以把整个序列反转为全1

题解

我不会

暴力,先反转1,再一个一个遍历过去遇到0就反转,可以过第一个点。

听大佬们说,是反转所有质数,然后是两两质数之积,然后是三三质数之积……

反正听不懂,等一手官方题解

后续

4.25:还没拿到比赛时的代码,不过排名出来了,又是省四,膜一手rqj大佬%%%%,也许第二题不寄还可以拿省三?还是得多努力才行啊。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值