第15届蓝桥杯省赛python组A,B,C集合

        过几天就省赛了,一直以来用的是C++,Python蓝桥杯也是刚刚开始准备(虽然深度学习用的都是python,但是两者基本没有任何关系),这两天在做去年题时犯了很多低级错误,因此记录一下以便自己复查

PS:很多问题的实现其实都是基于C++换成python的,因此很多代码显得比较丑,还请见谅。

为了结构清晰,我从Python易错点和2024年题目这两部分进行展开:

2024真题(大部分写了,但有一小部分没有做):

1.树状数组+思维:6000. 植物生命力 - AcWing题库

思路:

我们反过去考虑,一个点的贡献不就是当前链上的比他大的又不是它的倍数的点的个数吗?这个链怎么保证呢?DFS递归序列不就是一条链吗,因此这点可以通过DFS实现,那怎么查到比他大的数又不是整除的呢?不妨先考虑比他大的,我们在DFS过程中维护树状数组即可,我们再通过枚举它的倍数对整除的进行排除即可。

代码实现:

import sys

from types import GeneratorType
def bootstrap(f, stack=[]):
    def wrappedfunc(*args, **kwargs):
        if stack:
            return f(*args, **kwargs)
        else:
            to = f(*args, **kwargs)
            while True:
                if type(to) is GeneratorType:
                    stack.append(to)
                    to = next(to)
                else:
                    stack.pop()
                    if not stack:
                        break
                    to = stack[-1].send(to)
            return to

    return wrappedfunc


n,s=map(int,input().split())
a=list(map(int,input().split()))
a=[0]+a
edge=[[] for i in range(n+10)]
tr=[0 for i in range(200010)]
vis=[0 for i in range(200010)]
ans=0
def lowbit(x):
    return x&-x

def add(pos,v):
    while pos<=n:
        tr[pos]+=v
        pos=pos+lowbit(pos)

def get(pos):
    res=0
    while pos>0:
        res+=tr[pos]
        pos-=lowbit(pos)
    
    return res
    
@bootstrap
def dfs(root,fa):
    global ans
    global n
    
    res=get(n)-get(a[root])
    
    for i in range(2*a[root],n+1,a[root]):
        if vis[i]==1:
            res-=1
    ans+=res
    vis[a[root]]=1
    add(a[root],1)
    for i in edge[root]:
        if i==fa:
            continue
        yield dfs(i,root)
    vis[a[root]]=0
    add(a[root],-1)
    yield None

for _ in range(n-1):
    u,v=map(int,input().split())
    edge[u].append(v)
    edge[v].append(u)

dfs(s,-1)
print(ans)

2.trie树链路减法:5999. 最大异或结点 - AcWing题库

思路:如果不管那个不能异或相连的点的话就是一个很板的字典树问题,现在我们的问题就是如何解决这个相连点不能异或的限制。

比较直观的想法就是把那个节点相邻的点从字典树中删除,然后正常操作,最后再恢复,那么如何实现呢?比较巧妙地,我们再新开一个数组来记下树上每个点的出现次数,删除的话就是依次从树链中走下来,走到的节点位置次数-1即可。

代码实现:

import sys
from types import GeneratorType
def bootstrap(f, stack=[]):
    def wrappedfunc(*args, **kwargs):
        if stack:
            return f(*args, **kwargs)
        else:
            to = f(*args, **kwargs)
            while True:
                if type(to) is GeneratorType:
                    stack.append(to)
                    to = next(to)
                else:
                    stack.pop()
                    if not stack:
                        break
                    to = stack[-1].send(to)
            return to

    return wrappedfunc
ans = 0
ind = 1
n = int(input())
N = 32
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值