結果

問題 No.1950 片道きゃっちぼーる
ユーザー siganaisiganai
提出日時 2022-05-20 23:52:17
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 3,639 bytes
コンパイル時間 1,661 ms
コンパイル使用メモリ 81,524 KB
実行使用メモリ 228,736 KB
最終ジャッジ日時 2023-10-20 14:47:18
合計ジャッジ時間 15,585 ms
ジャッジサーバーID
(参考情報)
judge15 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 53 ms
63,500 KB
testcase_01 AC 49 ms
63,524 KB
testcase_02 AC 48 ms
63,548 KB
testcase_03 AC 598 ms
217,244 KB
testcase_04 WA -
testcase_05 AC 53 ms
63,624 KB
testcase_06 AC 496 ms
211,864 KB
testcase_07 AC 607 ms
203,856 KB
testcase_08 AC 959 ms
199,688 KB
testcase_09 AC 586 ms
226,012 KB
testcase_10 AC 837 ms
217,360 KB
testcase_11 AC 585 ms
218,692 KB
testcase_12 AC 581 ms
217,896 KB
testcase_13 AC 725 ms
205,520 KB
testcase_14 AC 569 ms
162,116 KB
testcase_15 WA -
testcase_16 AC 497 ms
202,084 KB
testcase_17 AC 49 ms
63,540 KB
testcase_18 AC 668 ms
203,612 KB
testcase_19 WA -
testcase_20 AC 596 ms
205,704 KB
testcase_21 AC 590 ms
166,332 KB
testcase_22 AC 610 ms
166,748 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