赞
踩
蓝桥杯,当然是很蓝的啦
前一天晚上调车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大佬%%%%,也许第二题不寄还可以拿省三?还是得多努力才行啊。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。