結果
| 問題 | No.2160 みたりのDominator |
| コンテスト | |
| ユーザー |
googol_S0
|
| 提出日時 | 2022-12-11 02:52:39 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 5,817 bytes |
| コンパイル時間 | 217 ms |
| コンパイル使用メモリ | 82,560 KB |
| 実行使用メモリ | 306,052 KB |
| 最終ジャッジ日時 | 2024-10-15 02:33:59 |
| 合計ジャッジ時間 | 47,721 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 79 WA * 14 |
ソースコード
from bisect import *
def scc(N,edges):
M=len(edges)
start=[0]*(N+1)
elist=[0]*M
for e in edges:
start[e[0]+1]+=1
for i in range(1,N+1):
start[i]+=start[i-1]
counter=start[:]
for e in edges:
elist[counter[e[0]]]=e[1]
counter[e[0]]+=1
visited=[]
low=[0]*N
Ord=[-1]*N
ids=[0]*N
NG=[0,0]
def dfs(v):
stack=[(v,-1,0),(v,-1,1)]
while stack:
v,bef,t=stack.pop()
if t:
if bef!=-1 and Ord[v]!=-1:
low[bef]=min(low[bef],Ord[v])
stack.pop()
continue
low[v]=NG[0]
Ord[v]=NG[0]
NG[0]+=1
visited.append(v)
for i in range(start[v],start[v+1]):
to=elist[i]
if Ord[to]==-1:
stack.append((to,v,0))
stack.append((to,v,1))
else:
low[v]=min(low[v],Ord[to])
else:
if low[v]==Ord[v]:
while(True):
u=visited.pop()
Ord[u]=N
ids[u]=NG[1]
if u==v:
break
NG[1]+=1
low[bef]=min(low[bef],low[v])
for i in range(N):
if Ord[i]==-1:
dfs(i)
for i in range(N):
ids[i]=NG[1]-1-ids[i]
group_num=NG[1]
counts=[0]*group_num
for x in ids:
counts[x]+=1
groups=[[] for i in range(group_num)]
for i in range(N):
groups[ids[i]].append(i)
return groups
N1,N2,N3,M=map(int,input().split())
NN=[N1+2,N2+2,N3+2]
NNN=[0,N1+2,N1+N2+4,N1+N2+N3+6]
K=N1+N2+N3
N=K+6
X=[]
E=[(0,N1+2),(N1+2,N1+N2+4),(N1+1,N1+N2+3),(N1+N2+3,N1+N2+N3+5)]
C=[]
for i in range(N1+2):
C.append(1)
for i in range(N2+2):
C.append(2)
for i in range(N3+2):
C.append(3)
for i in range(4):
E.append((E[i][1],E[i][0]))
for i in range(N1+1):
E.append((i,i+1))
for i in range(N2+1):
i+=N1+2
E.append((i,i+1))
for i in range(N3+1):
i+=N1+N2+4
E.append((i,i+1))
for i in range(M):
u,v=map(int,input().split())
X.append((u,v))
u-=1
v-=1
if u<N1:
u+=1
elif u<N1+N2:
u+=3
elif u<N1+N2+N3:
u+=5
elif u==K:
u=0
else:
u=N-1
u,v=v,u
if u<N1:
u+=1
elif u<N1+N2:
u+=3
elif u<N1+N2+N3:
u+=5
elif u==K:
u=0
else:
u=N-1
E.append((u,v))
E.append((v,u))
S=scc(N,E)
L=len(S)
V=[0]*L
P=[[1234567,-1,1234567,-1,1234567,-1] for i in range(L)]
for i in range(L):
for j in range(len(S[i])):
v=S[i][j]
c=C[v]
if c==3:
V[i]|=4
else:
V[i]|=c
w=c-1
P[i][w*2]=min(P[i][w*2],v)
P[i][w*2+1]=max(P[i][w*2+1],v)
P[i]=tuple(P[i])
Q=[]
R=[[],[],[]]
for i in range(L):
if V[i]==7:
Q.append(P[i])
for j in range(3):
R[j].append((P[i][2*j],P[i][2*j+1]))
for j in range(3):
if P[i][j*2+1]-P[i][j*2]==NN[j]-1:
print(0)
exit()
for i in range(3):
R[i].sort()
T=[[] for i in range(len(R[0]))]
for i in range(L):
if V[i]==7:
continue
if P[i][1]!=-1:
v=bisect_left(R[0],(P[i][0],P[i][1]))-1
T[v].append(P[i])
elif P[i][3]!=-1:
v=bisect_left(R[1],(P[i][2],P[i][3]))-1
T[v].append(P[i])
else:
v=bisect_left(R[2],(P[i][4],P[i][5]))-1
T[v].append(P[i])
ANS=0
for I in range(len(T)-1):
Y=[[R[0][I][1]+1,R[0][I+1][0]],[R[1][I][1]+1,R[1][I+1][0]],[R[2][I][1]+1,R[2][I+1][0]]]
Z=[[],[],[]]
ZZ=[[],[],[]]
for i in range(3):
for j in range(Y[i][0],Y[i][1]):
Z[i].append((0,-1,-1))
ZZ[i].append((i+1)*1000000+j)
ZZ[i].append((i+1)*1000000+500000)
for i in range(len(T[I])):
if T[I][i][1]>=0 and T[I][i][3]>=0:
v=T[I][i][1]-Y[0][0]
w=T[I][i][3]-Y[1][0]
Z[0][v]=(Z[0][v][0],1,w)
Z[1][w]=(Z[1][w][0],0,v)
ZZ[0][v]=i
ZZ[1][w]=i
elif T[I][i][1]>=0 and T[I][i][5]>=0:
v=T[I][i][1]-Y[0][0]
w=T[I][i][5]-Y[2][0]
Z[0][v]=(Z[0][v][0],2,w)
Z[2][w]=(Z[2][w][0],0,v)
ZZ[0][v]=i
ZZ[2][w]=i
elif T[I][i][3]>=0 and T[I][i][5]>=0:
v=T[I][i][3]-Y[1][0]
w=T[I][i][5]-Y[2][0]
Z[1][v]=(Z[1][v][0],2,w)
Z[2][w]=(Z[2][w][0],1,v)
ZZ[1][v]=i
ZZ[2][w]=i
for j in range(3):
if T[I][i][j*2]<T[I][i][j*2+1]:
for k in range(T[I][i][j*2]+1,T[I][i][j*2+1]+1):
k-=Y[j][0]
Z[j][k]=(1,Z[j][k][1],Z[j][k][2])
W=[]
a,b,c=Y[0][1]-Y[0][0],Y[1][1]-Y[1][0],Y[2][1]-Y[2][0]
W=[(a,b,c,0)]
abc=[a,b,c]
while a+b+c>0:
if a>0:
if a==Y[0][1]-Y[0][0]:
a-=1
abc[0]-=1
W.append((a,b,c,0))
continue
if not(Z[0][a][1]!=-1 and abc[Z[0][a][1]]>Z[0][a][2]):
a-=1
abc[0]-=1
W.append((a,b,c,0))
continue
if b>0:
if b==Y[1][1]-Y[1][0]:
b-=1
abc[1]-=1
W.append((a,b,c,1))
continue
if not(Z[1][b][1]!=-1 and abc[Z[1][b][1]]>Z[1][b][2]):
b-=1
abc[1]-=1
W.append((a,b,c,1))
continue
c-=1
abc[2]-=1
W.append((a,b,c,2))
for i in range(len(W)):
W[i]=list(W[i])
if ZZ[0][W[i][0]]==ZZ[1][W[i][1]]:
W[i].append(0b10011001)
elif ZZ[0][W[i][0]]==ZZ[2][W[i][2]]:
W[i].append(0b10100101)
elif ZZ[1][W[i][1]]==ZZ[2][W[i][2]]:
W[i].append(0b11000011)
else:
W[i].append(0b11111111)
W[i]=tuple(W[i])
dp=[[0]*8 for i in range(len(W))]
dp[0][7]=1
for i in range(len(W)-1):
for j in range(8):
jj=j&(~(1<<W[i+1][3]))
kk=(jj^j)>>W[i+1][3]
for k in range(kk+1):
jjj=jj|(k<<W[i+1][3])
if (W[i+1][4]>>jjj)&1:
dp[i+1][jjj]+=dp[i][j]
ANS+=sum(dp[-1])
print(ANS)
googol_S0