第14届蓝桥杯C++A组题解

J 翻转硬币

不会写

I 像素

枚举第i行

二进制枚举状态

然后check(i)是否合法,如果合法就dfs(i+1)

check是核心
判断第上一行是否==A[i][j]
判断第i行是否小于等于A且,c+3>=A
判断下一行是否小于等于A且,c+6>=A

H 异或和求和

按位做就好了
比如
5
1 2 3 4 5
bit=0 数组变成 10101
bit=1 数组变成 01100

单独考虑bit=0,模2意义下求前缀和变成11001
开一个数组c[2]
这一位的贡献就变成了sum+=c[1-b[i]]
然后记录一下c[b[i]]++

ans+=(1<<bit)*sum

G

克鲁斯卡尔重构一个最大树,对于每个询问求lca
刚开始没想到,我还想二分答案判断是否能用权值大于mid的边构造u到v的连通性

F

不会,我打的暴力
盲猜一手折半搜索可以处理

E

树上启发式合并
维护一个ma[u]和sz[u]
ma表示最大颜色个数
sz表示size
mp[u].size()表示颜色段
判断(sz%mp.size()==0 && sz/mp.size()==ma) ans++

D

区间dp预处理一下

for(len=2~n)
	for(l=1~)
		int r=l+len-1;
		if(s[l]>s[r])f[l][r]=1;
		else if(s[l]==s[r])f[l][r]=f[l+1][r-1]

for(i=2~n)
	for(j)
		ans+=f[j][i];

cout<<ans

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值