結果

問題 No.1950 片道きゃっちぼーる
ユーザー siganaisiganai
提出日時 2022-05-20 23:52:17
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 3,639 bytes
コンパイル時間 159 ms
コンパイル使用メモリ 82,304 KB
実行使用メモリ 231,336 KB
最終ジャッジ日時 2024-09-20 10:17:27
合計ジャッジ時間 15,566 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 60 ms
64,256 KB
testcase_01 AC 60 ms
64,128 KB
testcase_02 AC 58 ms
64,384 KB
testcase_03 AC 647 ms
217,976 KB
testcase_04 WA -
testcase_05 AC 60 ms
64,384 KB
testcase_06 AC 530 ms
212,772 KB
testcase_07 AC 563 ms
205,076 KB
testcase_08 AC 1,042 ms
200,572 KB
testcase_09 AC 658 ms
228,444 KB
testcase_10 AC 718 ms
218,276 KB
testcase_11 AC 645 ms
219,872 KB
testcase_12 AC 654 ms
217,988 KB
testcase_13 AC 786 ms
206,308 KB
testcase_14 AC 611 ms
163,092 KB
testcase_15 WA -
testcase_16 AC 548 ms
202,580 KB
testcase_17 AC 61 ms
64,384 KB
testcase_18 AC 751 ms
204,544 KB
testcase_19 WA -
testcase_20 AC 601 ms
206,248 KB
testcase_21 AC 641 ms
166,916 KB
testcase_22 AC 641 ms
167,544 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#!/usr/bin/env PyPy3

from collections import Counter, defaultdict, deque
import itertools
import re
import math
from functools import reduce
import operator
import bisect
from heapq import *
import functools

mod=998244353

import sys
input=sys.stdin.readline
n=int(input())
x=list(map(int,input().split()))
a=list(map(int,input().split()))
'''
p = [i for i in range(n)]
p.sort(key = lambda y:x[y]+a[y],reverse = True)
ans = [-1] * n
for pp in p:
    ans[pp] = x[pp] + a[pp]
    idx = bisect.bisect_right(x,x[pp] + a[pp])
    if x[idx-1] == x[pp] + a[pp]:
        ans[pp] = max(ans[pp],ans[idx-1])
    idx = bisect.bisect_right(x,x[pp] - a[pp])
    if idx == 0:
        continue
    if x[idx-1] == x[pp] - a[pp]:
        ans[pp] = max(ans[pp],ans[idx-1])
for i in range(n):
    print(ans[i]-x[i])
'''
class SCC:
    def __init__(self,n):
        self.n = n
        self.edges = []
 
    def add_edge(self,a,b):
        self.edges.append((a,b))
 
    def scc(self):
        n = self.n
        counter = [0]*(n+1)
        elist = [0]*len(self.edges)
        for x,y in self.edges:
            counter[x+1] += 1
        for x in range(n):
            counter[x+1] += counter[x]
        start = counter[:]
        for x,y in self.edges:
            elist[counter[x]] = y
            counter[x] += 1
 
        k = 0
        low = [0]*n
        num = [-1]*n
        pre = [None]*n
        visited = []
        q = []
        sccs = []
        for x in range(n):
            if num[x] < 0:
                q.append(x)
                q.append(x)
                while q:
                    x = q.pop()
                    if num[x] < 0:
                        low[x] = num[x] = k
                        k += 1
                        visited.append(x)
                        for i in range(start[x],start[x+1]):
                            y = elist[i]
                            if num[y] < 0:
                                q.append(y)
                                q.append(y)
                                pre[y] = x
                            else:
                                low[x] = min(low[x],num[y])
                    else:
                        if low[x] == num[x]:
                            scc = []
                            while 1:
                                y = visited.pop()
                                num[y] = n
                                scc.append(y)
                                if x == y:
                                    break
                            sccs.append(scc)
                        y = pre[x]
                        if y is not None:
                            low[y] = min(low[y],low[x])
        return sccs[::-1]
scc = SCC(n)
for i in range(n):
    idx = bisect.bisect_right(x,x[i] + a[i])
    if x[idx-1] == x[i] + a[i]:
        scc.add_edge(i,idx-1)
    idx = bisect.bisect_right(x,x[i] - a[i])
    if idx == 0:continue
    if x[idx-1] == x[i] - a[i]:
        scc.add_edge(i,idx-1)
tab = scc.scc()
pos = [0] * n
able = [set() for _ in range(len(tab))]
for i in range(len(tab)):
    for j in tab[i]:
        pos[j] = i
        able[i].add(x[j]+a[j])
        able[i].add(x[j]-a[j])
p = [i for i in range(n)]
p.sort(key = lambda y:x[y]+a[y],reverse = True)
ans = [-1] * n
used = [0] * len(tab)
for pp in p:
    if used[pos[pp]]:continue
    ans[pp] = x[pp] + a[pp]
    for j in able[pos[pp]]:
        idx = bisect.bisect_right(x,j)
        if idx == 0:
            continue
        if x[idx-1] == j:
            ans[pp] = max(ans[pp],ans[idx-1])
    for j in tab[pos[pp]]:
        ans[j] = ans[pp]
    used[pos[pp]] = 1
for i in range(n):
    print(ans[i]-x[i])
0