python前缀差分二分刷题

这篇博客记录了使用Python进行前缀差分和二分法解决算法题目的过程,包括54到64题的解题心得。作者在解决54、55、56等题时应用了前缀和,而在59、60、61等题中尝试了二分法,但遇到了超时和理解难题,部分问题涉及位运算和边界处理。博客中还提到了提高输入效率和代码边界处理的重要性,并标记了一些待回顾整理的算法。
摘要由CSDN通过智能技术生成

设置一个vip隐私,夹杂一些碎碎念......涉及到一些转自其他佬的题解

🚩flag为留存,等技术强硬再钻一把......

***前缀差分***

2024.3.24

54.求和

这题直接会超时(50%,可能是初次代码中每次都需要多次重复计算。下位前缀和题解

n = int(input())
a = [0]+[int(i) for i in input().split()]    #读入a[1]~a[n]。a[0]不用
sum = [0] * (n+1)                            #定义前缀和
sum[1] = 0
for i in range(1,n): sum[i] = a[i]+sum[i-1]  #预计算前缀和sum[1]~sum[n-1]
s = 0
for i in range(1,n): s += sum[i]*a[i+1]      #计算和s
print(s)

类似的方法自己尝试了下,只不过换成了后缀和100%

import os
import sys

# 请在此输入您的代码
n = int(input())
s = [0] + list(map(int,input().split()))
ss = [sum(s)] * (n+1)
for i in range(1,n+1):
    ss[i] = ss[i-1]-s[i]
summ = 0
for i in range(1,n):
        summ += ss[i] * s[i]     
print(summ)

 55.可获得的最小取值

依然是前缀和,但是只有50%,下为题解

n, k = map(int, input().split())
b = list(map(int, input().split()))
a=[0] + sorted(b)       # a[0]不用,从a[1]开始
s = [0] * (n+1)
for i in range(1, n+1):  s[i] = s[i-1] + a[i]
ans = 10**18
for p in range(1, k+1):
    ans = min(s[n] - s[n+p-k] + s[2*p], ans)
print(ans)

2024.3.25

56.异或和之和

最终50%超时超内存

import os
import sys

n = int(input())
a = [int(x) for x in input().split()]
ans = 0
for k in range(21):            # 所有a不超过20位
    zero, one = 1, 0           # 统计第k位的0和1的数量
    cnt, sum = 0, 0            #cnt用于统计第k位有多少对si⊕sj =1
    for i in range(n):
        v = (a[i] >> k) & 1    # 取a[i]的第k位
        sum ^= v               # 对所有a[i]的第k位做异或得到sum,sum等于0或者1
        if sum == 0:           # 前缀和为0
            zero += 1          # 0的数量加1
            cnt += one         # 这次sum=0,这个sum跟前面等于1的sum异或得1
        else:                  # 前缀异或为1
            one += 1           # 1的数量加1
            cnt += zero        # 这次sum=1,这个sum跟前面等于0的sum异或得1
    ans += cnt * (1 << k)      # 第k位的异或和相加
print(ans)
<
  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值