cp-library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub kobejean/cp-library

:heavy_check_mark: cp_library/ds/view/csr_cls.py

Depends on

Required by

Verified with

Code

import cp_library.__header__
from typing import Generic
from cp_library.misc.typing import _T
import cp_library.ds.__header__
import cp_library.ds.view.__header__
from cp_library.ds.view.view_cls import view

class CSR(Generic[_T]):
    __slots__ = 'A', 'O'
    def __init__(csr, A: list[_T], O: list[int]): csr.A, csr.O = A, O
    def __len__(csr): return len(csr.O)-1
    def __getitem__(csr, i: int): return view(csr.A, csr.O[i], csr.O[i+1])
    def __call__(csr, i: int, j: int): return csr.A[csr.O[i]+j]
    def set(csr, i: int, j: int, v: _T): csr.A[csr.O[i]+j] = v
    @classmethod
    def bucketize(cls, N: int, K: list[int], V: list[_T]):
        A: list[_T] = [0]*len(K); O = [0]*(N+1)
        for k in K: O[k] += 1
        for i in range(N): O[i+1] += O[i]
        for e in range(len(K)): k = K[~e]; O[k] -= 1; A[O[k]] = V[~e]
        return cls(A, O)
'''
╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸
             https://kobejean.github.io/cp-library               
'''
from typing import Generic
from typing import TypeVar
_S = TypeVar('S')
_T = TypeVar('T')
_U = TypeVar('U')




import sys

def list_find(lst: list, value, start = 0, stop = sys.maxsize):
    try:
        return lst.index(value, start, stop)
    except:
        return -1

class view(Generic[_T]):
    __slots__ = 'A', 'l', 'r'
    def __init__(V, A: list[_T], l: int, r: int): V.A, V.l, V.r = A, l, r
    def __len__(V): return V.r - V.l
    def __getitem__(V, i: int): 
        if 0 <= i < V.r - V.l: return V.A[V.l+i]
        else: raise IndexError
    def __setitem__(V, i: int, v: _T): V.A[V.l+i] = v
    def __contains__(V, v: _T): return list_find(V.A, v, V.l, V.r) != -1
    def set_range(V, l: int, r: int): V.l, V.r = l, r
    def index(V, v: _T): return V.A.index(v, V.l, V.r) - V.l
    def reverse(V):
        l, r = V.l, V.r-1
        while l < r: V.A[l], V.A[r] = V.A[r], V.A[l]; l += 1; r -= 1
    def sort(V, /, *args, **kwargs):
        A = V.A[V.l:V.r]; A.sort(*args, **kwargs)
        for i,a in enumerate(A,V.l): V.A[i] = a
    def pop(V): V.r -= 1; return V.A[V.r]
    def append(V, v: _T): V.A[V.r] = v; V.r += 1
    def popleft(V): V.l += 1; return V.A[V.l-1]
    def appendleft(V, v: _T): V.l -= 1; V.A[V.l] = v; 
    def validate(V): return 0 <= V.l <= V.r <= len(V.A)

class CSR(Generic[_T]):
    __slots__ = 'A', 'O'
    def __init__(csr, A: list[_T], O: list[int]): csr.A, csr.O = A, O
    def __len__(csr): return len(csr.O)-1
    def __getitem__(csr, i: int): return view(csr.A, csr.O[i], csr.O[i+1])
    def __call__(csr, i: int, j: int): return csr.A[csr.O[i]+j]
    def set(csr, i: int, j: int, v: _T): csr.A[csr.O[i]+j] = v
    @classmethod
    def bucketize(cls, N: int, K: list[int], V: list[_T]):
        A: list[_T] = [0]*len(K); O = [0]*(N+1)
        for k in K: O[k] += 1
        for i in range(N): O[i+1] += O[i]
        for e in range(len(K)): k = K[~e]; O[k] -= 1; A[O[k]] = V[~e]
        return cls(A, O)
Back to top page