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")

浙公网安备 33010602011771号