Submission #54397093


Source Code Expand

Copy
import sys
sys.setrecursionlimit(10**8)
class Scc:
def __init__(self,n):
self.n = n
self.edges = []
def add_edge(self,fr,to):
assert 0 <= fr < self.n
assert 0 <= to < self.n
self.edges.append((fr, to))
def scc(self):
csr_start = [0] * (self.n + 1)
csr_elist = [0] * len(self.edges)
for fr,to in self.edges:
csr_start[fr + 1] += 1
for i in range(1,self.n+1):
csr_start[i] += csr_start[i-1]
counter = csr_start[:]
for fr,to in self.edges:
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
import sys
sys.setrecursionlimit(10**8)
class Scc:
    def __init__(self,n):
        self.n = n
        self.edges = []

    def add_edge(self,fr,to):
        assert 0 <= fr < self.n
        assert 0 <= to < self.n
        self.edges.append((fr, to))

    def scc(self):
        csr_start = [0] * (self.n + 1)
        csr_elist = [0] * len(self.edges)
        for fr,to in self.edges:
            csr_start[fr + 1] += 1
        for i in range(1,self.n+1):
            csr_start[i] += csr_start[i-1]
        counter = csr_start[:]
        for fr,to in self.edges:
            csr_elist[counter[fr]] = to
            counter[fr] += 1

        self.now_ord = self.group_num = 0
        self.visited = []
        self.low = [0] * self.n
        self.ord = [-1] * self.n
        self.ids = [0] * self.n
        def _dfs(v):
            self.low[v] = self.ord[v] = self.now_ord
            self.now_ord += 1
            self.visited.append(v)
            for i in range(csr_start[v], csr_start[v+1]):
                to = csr_elist[i]
                if self.ord[to] == -1:
                    _dfs(to)
                    self.low[v] = min(self.low[v], self.low[to])
                else:
                    self.low[v] = min(self.low[v], self.ord[to])
            if self.low[v] == self.ord[v]:
                while 1:
                    u = self.visited.pop()
                    self.ord[u] = self.n
                    self.ids[u] = self.group_num
                    if u==v: break
                self.group_num += 1
        for i in range(self.n):
            if self.ord[i] == -1: _dfs(i)
        for i in range(self.n):
            self.ids[i] = self.group_num - 1 - self.ids[i]

        groups = [[] for _ in range(self.group_num)]
        for i in range(self.n):
            groups[self.ids[i]].append(i)
        return groups
    
N = int(input())
A = list(map(int,input().split()))

scc = Scc(N)
for i,a in enumerate(A):
    scc.add_edge(i,a-1)

groups = scc.scc()
# print(groups)

cnt = [0]*N
for g in groups[::-1]:
    l = len(g)

    if l>1:
        for i in g:
            cnt[i] = l
    else:
        i = g[0]
        a = A[i]-1
        cnt[i] = cnt[a] + 1
# print(cnt)
ans = sum(cnt)
print(ans)

Submission Info

Submission Time
Task E - Reachability in Functional Graph
User do_an
Language Python (PyPy 3.10-v7.3.12)
Score 450
Code Size 2293 Byte
Status AC
Exec Time 622 ms
Memory 373268 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 450 / 450
Status
AC × 3
AC × 28
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_small_00.txt, 01_small_01.txt, 01_small_02.txt, 01_small_03.txt, 01_small_04.txt, 01_small_05.txt, 01_small_06.txt, 01_small_07.txt, 01_small_08.txt, 01_small_09.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 03_large_cycle_00.txt, 03_large_cycle_01.txt, 04_tree_plus_an_edge_00.txt, 04_tree_plus_an_edge_01.txt, 05_many_self_loops_00.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 56 ms 76556 KB
00_sample_01.txt AC 56 ms 76628 KB
00_sample_02.txt AC 56 ms 76884 KB
01_small_00.txt AC 58 ms 76572 KB
01_small_01.txt AC 58 ms 76596 KB
01_small_02.txt AC 58 ms 76820 KB
01_small_03.txt AC 60 ms 76740 KB
01_small_04.txt AC 59 ms 76588 KB
01_small_05.txt AC 56 ms 76604 KB
01_small_06.txt AC 56 ms 76636 KB
01_small_07.txt AC 59 ms 76944 KB
01_small_08.txt AC 58 ms 76620 KB
01_small_09.txt AC 59 ms 76616 KB
02_random_00.txt AC 197 ms 134852 KB
02_random_01.txt AC 214 ms 136084 KB
02_random_02.txt AC 227 ms 139648 KB
02_random_03.txt AC 223 ms 136176 KB
02_random_04.txt AC 128 ms 110568 KB
02_random_05.txt AC 223 ms 136076 KB
02_random_06.txt AC 115 ms 87732 KB
02_random_07.txt AC 217 ms 136308 KB
02_random_08.txt AC 210 ms 133896 KB
02_random_09.txt AC 216 ms 136492 KB
03_large_cycle_00.txt AC 622 ms 373268 KB
03_large_cycle_01.txt AC 617 ms 373012 KB
04_tree_plus_an_edge_00.txt AC 255 ms 136032 KB
04_tree_plus_an_edge_01.txt AC 251 ms 136128 KB
05_many_self_loops_00.txt AC 137 ms 136196 KB


2025-04-15 (Tue)
03:16:55 +00:00