分析:明显考虑二分,(部分丑陋的笔记在下面,方便我自己看的,不喜勿喷)
首先我们可以二分出包含在 [L,R]之间的完整的取值区间,[Get(a-1) , Get(b) ]
因为左端点二分的是区间前端点,就是前端要包含在内,所以a-1
然后就是对于两边突出部分进行计算,
不知道为什么30%没有过,希望评论区的大佬指正 >..<
def lfind(n):
l=1;r=int(1e6)
while(l<r):
mid=l+r>>1
if((mid*(mid-1)//2+1)>=n):
r=mid
else:
l=mid+1
return l
def rfind(n):
l=1;r=int(1e6)
while(l<r):
mid=l+r+1>>1
if(mid*(mid+1)//2<=n):
l=mid
else:
r=mid-1
return l
def Get(n):
return int(((n*(n+1))//2+n*(n+1)*(2*n+1)//6)/2)
def miniget(n):
return n*(n+1)//2
n=int(input())
for i in range(n):
l,r=map(int,input().split())
a,b=lfind(l),rfind(r)
gb=Get(b)
ga=Get(a-1)
k=(miniget(a-1)-l+1)
sum1=(gb-ga)+(2*a-1-k)*k//2+miniget(r-miniget(b))
print(sum1)#,a,b,ga,gb,k,miniget(r-gb)
标签:二分,Get,Python,mid,国赛,蓝桥,int,while,1e6
From: https://blog.csdn.net/wrj1472583690/article/details/136676423