当前位置: 首页 > news >正文

Python前缀和(例题:异或和,求和)

前缀和

前缀和:对于一个长度为n的列表a,前缀和为:

sum[i]=a[0]+a[1]+...+a[i] 

前缀和的性质: 

第一条性质用于处理出前缀和:

  Sum[i]=Sum[i-1]+a[i]

第二条性质可以在O(l)的时间内求出区间和:

  a[l]+....+a[r] =Sum[r]-Sum[l-1]

前缀和模板标准写法

def get_persum(a): #下标从0开始
    n=len(a)
    sum=[0]*n
    sum[0]=a[0]
    for i in range(1,n):
        sum[i]=sum[i-1]+a[i]

#快速求区间之和
def get_sum(sum,l,r):
    if l==0:
        return sum[r]

    else:
        return sum[r]-sum[l-1]

a=[1,2,3,4,5]
print("a=",a)
print("sum=",sum)

例题1: 异或和—位运算

题目描述

给定一个数组 Ai,分别求其每个子段的异或和,并求出它们的和。或者说,对于每组满足 1≤L≤R≤n的 L, R,求出数组中第 L 至第 R 个元素的异或和。然后输出每组 L, R 得到的结果加起来的值。

输入格式

输入的第一行包含一个整数 nn。

第二行包含 n 个整数 Ai,相邻整数之间使用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。

样例输入

5
1 2 3 4 5

样例输出

39

代码实现:

        这个用前缀和写的代码可以通过90%,简单好理解并且拿到的分比较高
n=int(input())
a=list(map(int,input().split()))
ans=0

for L in range(n):
  sum1=0
  for R in range(L,n):
    sum1^=a[R]
    ans+=sum1

print(ans)
 这个是100%通过的代码
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)

例题 2:求和

 代码

        利用前缀和思想求后缀和,计算后缀和数组C,C1为a2到an的和,C2为 a3到an的和

n=int(input())
a=list(map(int,input().split()))
ans=0

c=[0]*n
c[0]=sum(a)-a[0]

for i in range(1,n):
  c[i]=c[i-1]-a[i]

for i in range(n):
  ans+=a[i]*c[i]

print(ans)

 

相关文章:

  • python中的变量 - 第一章
  • Linux第一节:Linux系统编程入门指南
  • 【参考资料 II】C 运算符大全:算术、关系、赋值、逻辑、条件、指针、符号、成员、按位、混合运算符
  • ctfshow WEB web签到题
  • 五种IO模型
  • 【JavaEE】Mybatis XML配置文件实现增删改查
  • 编程从键盘输入一个大写英文字符,将其转换为小写字符显示并显示出它的十进制,十六的 ASCI码。
  • Kubernetes集群中部署SonarQube服务
  • Gitee上库常用git命令
  • Babel 从入门到精通(四):@babel/template的应用实例与最佳实践
  • 【JavaEE】springMVC返回Http响应
  • 【负载均衡系列】Nginx
  • 【例6.5】活动选择(信息学奥赛一本通-1323)
  • 如何拆解模糊需求管理
  • 【C语言】自定义数据类型:联合体和枚举
  • Java Collection API增强功能系列之二 List.of、Set.of、Map.of
  • 《Python全栈开发》第12课:RESTful API设计 - 构建现代化接口
  • ArrayList<E>案例//定义一个方法,将价格低于3000的手机信息返回
  • 0324-项目
  • 【蓝桥杯速成】| 11.回溯 之 子集问题
  • “降息潮”延续!存款利率全面迈向“1时代”
  • 视频|漫画家寂地:古老丝路上的文化与交流留下的独特印记
  • 小米回应SU7Ultra排位模式限制车辆动力:暂停推送更新
  • 明天起,沪苏湖高铁、杭温高铁推出13款新型票制产品
  • 抗战回望19︱《中国工程师学会四川考察团报告》:“将来重工业所在,以四川为最适宜之地点”
  • 马丽称不会与沈腾终止合作,“他是我的恩人,也是我的贵人”