26spring做题记录 - June

2026.6.1

稳定的符文序列

a=input()
n=len(a)
i=0
j=0
ans=0
s=set()
while(i<n and j<n):
    if(a[j] not in s):
        s.add(a[j])
        j+=1
        ans=max(ans,j-i)
    else:
        s.remove(a[i])
        i+=1
print(ans)

工程师的齿轮

排序并双指针会破坏原来的顺序,使用哈希表扫两遍。

from collections import defaultdict
n,t=map(int,input().split())
s=list(map(int,input().split()))
d=defaultdict(int)
for i in range(n):
    if(s[i] in d):
        continue
    else:
        d[s[i]]=i+1
ans=(n,n)
for i in range(n):
    if(t-s[i] in d and ans>(d[t-s[i]],i+1) and ((i+1)!=d[t-s[i]])):
        ans=(d[t-s[i]],i+1)
print(ans[0],ans[1])

狭路相逢

n=int(input())
a=list(map(int,input().split()))
s=[]
for i in range(n):
    if(a[i]>0):
        s.append(a[i])
    else:
        while(s and s[-1]>0 and a[i]<0):
            if(-a[i]>=s[-1]):
                a[i]+=s[-1]
                s.pop()
            else:
                s[-1]+=a[i]
                a[i]=0
        if(a[i]<0):
            s.append(a[i])
print(len(s))
print(*s)

量子芯片研发

from collections import deque
n,m=map(int,input().split())
a=[0]+list(map(int,input().split()))
g=[[]for _ in range(n+1)]
in_deg=[0]*(n+1)
for i in range(m):
    u,v=map(int,input().split())
    g[u].append(v)
    in_deg[v]+=1
q=deque()
ve=[0]*(n+1)
cnt=0
for i in range(1,n+1):
    if(in_deg[i]==0):
        q.append(i)
        cnt+=1
while(q):
    idx=q.popleft()
    for i in g[idx]:
        ve[i]=max(ve[i],ve[idx]+a[idx])
        in_deg[i]-=1
        if(in_deg[i]==0):
            q.append(i)
            cnt+=1
if(cnt!=n):
    print(-1)
else:
    ans=0
    for i in range(1,n+1):
        ans=max(ans,ve[i]+a[i])
    print(ans)

动态图连通性

n,q=map(int,input().split())
fa=[i for i in range(n+1)]
siz=[1 for i in range(n+1)]
cnt=[0 for i in range(n+1)]
from collections import defaultdict
ans=0
def find(x):
    if(x==fa[x]):
        return x
    fa[x]=find(fa[x])
    return fa[x]
def merge(x,y):
    global ans
    fx=find(x)
    fy=find(y)
    if(fx==fy):
        return ans
    if(siz[fx]>siz[fy]):
        fx,fy=fy,fx
    ans-=(cnt[fx]+cnt[fy])
    fa[fx]=fy
    siz[fy]+=siz[fx]
    cnt[fx]=0
    tmp=siz[fy]
    cnt[fy]=tmp*(tmp-1)//2
    ans+=cnt[fy]
    return ans
for i in range(q):
    u,v=map(int,input().split())
    print(merge(u,v))

0-W 最小生成树

bfs求所有连通块并标记,然后对连通块跑MST.

from collections import deque
n,m=map(int,input().split())
g=[[]for _ in range(n+1)]
edges=[]
for i in range(m):
    u,v,w=map(int,input().split())
    g[u].append(v)
    g[v].append(u)
    edges.append((w,u,v))
par=[0]*(n+1)
q=deque()
un_vis=[i for i in range(1,n+1)]
marked=[0]*(n+1)
cnt=0
while(un_vis):
    cnt+=1
    start=un_vis.pop()
    q.append(start)
    par[start]=cnt
    while(q):
        idx=q.popleft()
        for i in g[idx]:
            marked[i]=1
        nxt=[]
        for i in un_vis:
            if(marked[i]==0):
                q.append(i)
                par[i]=cnt
            else:
                nxt.append(i)
        un_vis=nxt
        for i in g[idx]:
            marked[i]=0
fa=[i for i in range(cnt+1)]
def find(x):
    if(x==fa[x]):
        return x
    fa[x]=find(fa[x])
    return fa[x]
def merge(x,y):
    fx=find(x)
    fy=find(y)
    if(fx==fy):
        return
    fa[fx]=fy
new_edges=[]
for w,u,v in edges:
    if(par[u]!=par[v]):
        new_edges.append((w,par[u],par[v]))
new_edges=sorted(new_edges,key=lambda x:x[0])
ans=0
tot=cnt-1
qwq=0
for w,u,v in new_edges:
    if(qwq==tot):
        break
    if(find(u)!=find(v)):
        merge(u,v)
        ans+=w
        qwq+=1
print(ans)

Excel表列序号

a=input()
n=len(a)
ans=0
for i in range(n):
    ans*=26
    ans+=ord(a[i])-ord('A')+1
print(ans)

清北学术走廊规划

n,m=map(int,input().split())
edges=[]
for i in range(m):
    u,v,w=map(int,input().split())
    edges.append((w,u,v))
fa=[i for i in range(n+1)]
def find(x):
    if(fa[x]==x):
        return fa[x]
    fa[x]=find(fa[x])
    return fa[x]
def merge(x,y):
    fx=find(x)
    fy=find(y)
    if(fx==fy):
        return
    fa[fx]=fy
cnt=0
ans=0
edges.sort(key=lambda x:x[0])
for w,u,v in edges:
    if(find(u)==find(v)):
        continue
    ans+=w
    cnt+=1
    merge(u,v)
if(cnt<n-1):
    print("orz")
else:
    print(ans)

简化路径

a=input().split("/")
s=[]
n=len(a)
for i in a:
    if(i==""):
        continue
    elif(i=="."):
        continue
    elif(i==".."):
        if(s):
            s.pop()
        else:
            continue
    else:
        s.append(i)
print("/",end="")
print("/".join(s))

沉没孤岛

n,m=map(int,input().split())
a=[]
for i in range(n):
    a.append(list(map(int,input().split())))
vis=[[0 for _ in range(m)]for _ in range(n)]
dx=[0,1,0,-1]
dy=[1,0,-1,0]
def dfs(flag,x,y):
    for i in range(4):
        xx=x+dx[i]
        yy=y+dy[i]
        if(0<=xx<n and 0<=yy<m):
            if(vis[xx][yy]==0 and a[xx][yy]==1):
                vis[xx][yy]=1
                a[xx][yy]=flag
                dfs(flag,xx,yy)
                
for i in range(n):
    if(a[i][0]==1 and vis[i][0]==0):
        vis[i][0]=1
        dfs(1,i,0)
    if(a[i][m-1]==1 and vis[i][m-1]==0):
        vis[i][m-1]=1
        dfs(1,i,m-1)
for i in range(m):
    if(a[0][i]==1 and vis[0][i]==0):
        vis[0][i]=1
        dfs(1,0,i)
    if(a[n-1][i]==1 and vis[n-1][i]==0):
        vis[n-1][i]=1
        dfs(1,n-1,i)
for i in range(1,n-1):
    for j in range(1,m-1):
        if(a[i][j]==1 and vis[i][j]==0):
            a[i][j]=0
            vis[i][j]=1
            dfs(0,i,j)
for i in range(n):
    print(*a[i])

神经网络

在拓扑序上面更新神经状态。神经不激活也要置零然后继续往下走,否则会干扰到判环的逻辑。

from collections import deque
import sys
n,p=map(int,input().split())
a=[0]
b=[0]
for i in range(n):
    u,v=map(int,input().split())
    a.append(u)
    b.append(v)
g=[[]for _ in range(n+1)]
in_deg=[0]*(n+1)
out_deg=[0]*(n+1)
for i in range(p):
    u,v,w=map(int,input().split())
    g[u].append((v,w))
    in_deg[v]+=1
    out_deg[u]+=1
    if(v==u):
        print("NULL")
        sys.exit(0)
q=deque()
cnt=0
for i in range(1,n+1):
    if(in_deg[i]==0):
        q.append(i)
        cnt+=1
while(q):
    idx=q.popleft()
    if(a[idx]<=0):
        a[idx]=0
    for i,w in g[idx]:
        a[i]+=w*a[idx]
        in_deg[i]-=1
        if(in_deg[i]==0):
            cnt+=1
            a[i]-=b[i]
            q.append(i)
flag=0
if(cnt<n):
    print("NULL")
else:
    for i in range(1,n+1):
        if(out_deg[i]==0 and a[i]>0):
            flag=1
            print(i,a[i])
    if(flag==0):
        print("NULL")

没有上司的宴会

import sys
sys.setrecursionlimit(10**7)
n=int(input())
a=[0]
for i in range(n):
    r=int(input())
    a.append(r)
up=[[]for _ in range(n+1)]
down=[[]for _ in range(n+1)]
in_deg=[0]*(n+1)
for i in range(n-1):
    l,k=map(int,input().split())
    up[l].append(k)
    down[k].append(l)
    in_deg[l]+=1
dp1=[0]*(n+1)#i号节点参加,最大值
dp2=[0]*(n+1)#i号节点不参加,最大值
root=0
for i in range(1,n+1):
    if(in_deg[i]==0):
        root=i
        break
def dfs(x):
    dp1[x]=a[x]
    for i in down[x]:
        dfs(i)
        dp1[x]+=dp2[i]
        dp2[x]+=max(dp1[i],dp2[i])
dfs(root)
print(max(dp1[root],dp2[root]))

Okabe and Boxes

重排之后清空,如果要取出的时候栈为空则说明可以随便取。否则重排一次。

n=int(input())
s=[]
cnt=0
res=1
for i in range(2*n):
    a=input()
    if(a[0]=='a'):
        op,num=a.split()
        s.append(int(num))
    else:
        if(s and s[-1]==res):
            s.pop()
            res+=1
        elif(len(s)==0):
            res+=1
            continue
        else:
            cnt+=1
            s.clear()
            res+=1
print(cnt)

分糖果

from collections import deque
n,m=map(int,input().split())
t=list(map(int,input().split()))
a=deque()
for i in range(n):
    a.append((t[i],i+1))
while(len(a)>1):
    num,idx=a.popleft()
    if(num>m):
        qaq=(num-m,idx)
        a.append(qaq)
print(a[0][1])

受限条件下可到达节点的数目

n=int(input())
g=[[]for _ in range(n)]
for i in range(n-1):
    u,v=map(int,input().split())
    g[u].append(v)
    g[v].append(u)
a=set(list(map(int,input().split())))
vis=[0]*n
def dfs(x):
    for i in g[x]:
        if(vis[i]==0 and i not in a):
            vis[i]=1
            dfs(i)
vis[0]=1
dfs(0)
print(sum(vis))

堆路径

n=int(input())
a=[0]+list(map(int,input().split()))
s=[]
is_max=1
is_min=1
def dfs(x,path):
    global is_max,is_min
    if(2*x>n):
        s.append(path)
        return
    if(2*x+1<=n):
        if(a[2*x+1]>a[x]):
            is_max=0
        if(a[2*x+1]<a[x]):
            is_min=0
        dfs(2*x+1,path+[a[2*x+1]])
    if(2*x<=n):
        if(a[2*x]>a[x]):
            is_max=0
        if(a[2*x]<a[x]):
            is_min=0
        dfs(2*x,path+[a[2*x]])
dfs(1,[a[1]])
for i in range(len(s)):
    print(*s[i])
if(is_max):
    print("Max Heap")
elif(is_min):
    print("Min Heap")
else:
    print("Not Heap")

谣言

n,m=map(int,input().split())
a=[0]+list(map(int,input().split()))
g=[[]for _ in range(n+1)]
vis=[0]*(n+1)
minm=[0]
for i in range(m):
    u,v=map(int,input().split())
    g[u].append(v)
    g[v].append(u)
def dfs(x,tag):
    for i in g[x]:
        if(vis[i]==0):
            vis[i]=tag
            minm[tag]=min(minm[tag],a[i])
            dfs(i,tag)
cnt=1
for i in range(1,n+1):
    if(vis[i]==0):
        vis[i]=cnt
        minm.append(a[i])
        dfs(i,cnt)
        cnt+=1
ans=sum(minm)
print(ans)

判断等价关系是否成立

不等关系不能传递,因此相等的合并,再把不等的全部跑一遍判断。

n=int(input())
fa=[i for i in range(30)]
def find(x):
    if(fa[x]==x):
        return x
    fa[x]=find(fa[x])
    return fa[x]
def merge(x,y):
    fx=find(x)
    fy=find(y)
    if(fx==fy):
        return
    fa[fx]=fy
flag=1
query=[]
for i in range(n):
    s=input()
    query.append(s)
    a=ord(s[0])-ord('a')
    b=ord(s[-1])-ord('a')
    if(s[1]=='='):
        merge(a,b)
for i in range(n):
    s=query[i]
    a=ord(s[0])-ord('a')
    b=ord(s[-1])-ord('a')
    if(s[1]=='!'):
        if(find(a)==find(b)):
            flag=0
if(flag):
    print("True")
else:
    print("False")
posted @ 2026-06-01 22:44  Amy-xue  阅读(2)  评论(0)    收藏  举报