python代码,大量TLE求助
查看原帖
python代码,大量TLE求助
325404
Boar楼主2023/9/4 20:16
[n,m]=list(map(int,input().split()))
D=[]
C=[]
for i in range(n):
    [x,y]=list(map(int,input().split()))
    D.append(x)
    C.append(y)
st=[[]]
t=n.bit_length()
for i in range(n):
    st[0].append(D[i])
l=1
N=n
#st表的预处理
for i in range(1,t):
    st.append([])
    N-=l
    for j in range(0,N):
        st[i].append(max(st[i-1][j],st[i-1][j+l]))
    l<<=1
#st表的配套查下标区间最大值函数,此处下标区间为闭区间,即包含D[l]和D[r]
def getmax(l,r):
    global st
    h=r-l+1
    lh=h.bit_length()-1
    lenh=1<<lh
    return max(st[lh][l],st[lh][r-lenh+1])
#二分法查找半径严格大于下标为x的圆盘半径的最小的下标
def nxtb(x):
    global n,st
    if(x==n-1):
        return 0
    key=st[0][x]
    l=x
    r=n-1
    m=0
    while(l!=r-1):
        m=(l+r)>>1
        v=getmax(x,m)
        if(v>key):
            r=m
        else:
            l=m
    return r
for i in range(m):
    [x,y]=list(map(int,input().split()))
    ans=0
    x-=1#题目的圆盘编号是下标+1,后面x+1同理
    y-=C[x]
    if(y<=0):
        print(x+1)
        continue
    while(True):
        x=nxtb(x)
        if(x==0):
            ans=0
            break
        ans=x+1
        y-=C[x]
        if(y<=0):
            break
    print(ans)

#5,#8,#9,#11~15TLE,其它通过而且时间充裕

2023/9/4 20:16
加载中...