107392024-04-10 23:39:4542Főnökszámpypy3Időlimit túllépés 40/100469ms115172 KiB
from sys import stdin, stdout
input=stdin.readline

from bisect import bisect_left as lower_bound
from bisect import bisect_right as upper_bound

class FenwickTree:
    def __init__(self, x):
        bit = self.bit = list(x)
        size = self.size = len(bit)
        for i in range(size):
            j = i | (i + 1)
            if j < size:
                bit[j] += bit[i]

    def update(self, idx, x):
        """updates bit[idx] += x"""
        while idx < self.size:
            self.bit[idx] += x
            idx |= idx + 1

    def __call__(self, end):
        """calc sum(bit[:end])"""
        x = 0
        while end:
            x += self.bit[end - 1]
            end &= end - 1
        return x

    def find_kth(self, k):
        """Find largest idx such that sum(bit[:idx]) <= k"""
        idx = -1
        for d in reversed(range(self.size.bit_length())):
            right_idx = idx + (1 << d)
            if right_idx < self.size and self.bit[right_idx] <= k:
                idx = right_idx
                k -= self.bit[idx]
        return idx + 1, k

class SortedList:
    block_size = 700

    def __init__(self, iterable=()):
        self.macro = []
        self.micros = [[]]
        self.micro_size = [0]
        self.fenwick = FenwickTree([0])
        self.size = 0
        for item in iterable:
            self.insert(item)

    def insert(self, x):
        i = lower_bound(self.macro, x)
        j = upper_bound(self.micros[i], x)
        self.micros[i].insert(j, x)
        self.size += 1
        self.micro_size[i] += 1
        self.fenwick.update(i, 1)
        if len(self.micros[i]) >= self.block_size:
            self.micros[i:i + 1] = self.micros[i][:self.block_size >> 1], self.micros[i][self.block_size >> 1:]
            self.micro_size[i:i + 1] = self.block_size >> 1, self.block_size >> 1
            self.fenwick = FenwickTree(self.micro_size)
            self.macro.insert(i, self.micros[i + 1][0])

    def pop(self, k=-1):
        i, j = self._find_kth(k)
        self.size -= 1
        self.micro_size[i] -= 1
        self.fenwick.update(i, -1)
        return self.micros[i].pop(j)

    def __getitem__(self, k):
        i, j = self._find_kth(k)
        return self.micros[i][j]

    def count(self, x):
        return self.upper_bound(x) - self.lower_bound(x)

    def __contains__(self, x):
        return self.count(x) > 0

    def lower_bound(self, x):
        i = lower_bound(self.macro, x)
        return self.fenwick(i) + lower_bound(self.micros[i], x)

    def upper_bound(self, x):
        i = upper_bound(self.macro, x)
        return self.fenwick(i) + upper_bound(self.micros[i], x)

    def _find_kth(self, k):
        return self.fenwick.find_kth(k + self.size if k < 0 else k)

    def __len__(self):
        return self.size

    def __iter__(self):
        return (x for micro in self.micros for x in micro)

    def __repr__(self):
        return str(list(self))


def main():
    # n^4/3*log(n)
    N = int(input())

    L = SortedList()
    A,B = list(map(int, input().split()))
    L.insert((A,-B))
    stdout.write('1\n')

    for _ in range(N-1):
        A,B = list(map(int, input().split()))
        i = upper_bound(L,(A,-B))
        if i==len(L):
            if B<=-L[-1][1]:
                L.insert((A,-B))
            else:
                L.insert((A,-B))
                while len(L)>1 and B>-L[-2][1] and A>L[-2][0]:
                    #print(L,A,-B)
                    L.pop(-2)
                    #print(L)
        else:
            if B<-L[i][1] and A<L[i][0]:
                pass
            else:
                L.insert((A,-B))
                while i>0 and B>-L[i-1][1] and A>L[i-1][0]:
                    #print(L,A,-B)
                    L.pop(i-1)
                    i-=1
                    #print(L)
        stdout.write(str(len(L))+'\n')
        
main()
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva45ms80284 KiB
2Elfogadva275ms106916 KiB
subtask25/5
3Elfogadva43ms81224 KiB
4Elfogadva46ms81152 KiB
5Elfogadva75ms88556 KiB
6Elfogadva107ms93480 KiB
subtask310/10
7Elfogadva43ms81792 KiB
8Elfogadva56ms87932 KiB
9Elfogadva63ms89708 KiB
10Elfogadva57ms86444 KiB
11Elfogadva83ms89988 KiB
12Elfogadva82ms89612 KiB
13Elfogadva107ms93604 KiB
14Elfogadva115ms95588 KiB
subtask40/10
15Elfogadva43ms82340 KiB
16Elfogadva46ms82028 KiB
17Elfogadva85ms90880 KiB
18Elfogadva105ms94764 KiB
19Elfogadva114ms94948 KiB
20Elfogadva130ms96800 KiB
21Elfogadva138ms96876 KiB
22Időlimit túllépés469ms39276 KiB
subtask525/25
23Elfogadva71ms89180 KiB
24Elfogadva83ms90020 KiB
25Elfogadva108ms95384 KiB
26Elfogadva128ms94860 KiB
27Elfogadva190ms102932 KiB
28Elfogadva225ms104704 KiB
29Elfogadva257ms106660 KiB
30Elfogadva259ms107288 KiB
subtask60/50
31Elfogadva43ms82440 KiB
32Elfogadva272ms108596 KiB
33Elfogadva43ms81224 KiB
34Elfogadva46ms81152 KiB
35Elfogadva75ms88556 KiB
36Elfogadva107ms93480 KiB
37Elfogadva43ms81792 KiB
38Elfogadva56ms87932 KiB
39Elfogadva63ms89708 KiB
40Elfogadva57ms86444 KiB
41Elfogadva83ms89988 KiB
42Elfogadva82ms89612 KiB
43Elfogadva107ms93604 KiB
44Elfogadva115ms95588 KiB
45Elfogadva43ms82340 KiB
46Elfogadva46ms82028 KiB
47Elfogadva85ms90880 KiB
48Elfogadva105ms94764 KiB
49Elfogadva114ms94948 KiB
50Elfogadva130ms96800 KiB
51Elfogadva138ms96876 KiB
52Időlimit túllépés469ms39276 KiB
53Elfogadva71ms89180 KiB
54Elfogadva83ms90020 KiB
55Elfogadva108ms95384 KiB
56Elfogadva128ms94860 KiB
57Elfogadva190ms102932 KiB
58Elfogadva225ms104704 KiB
59Elfogadva257ms106660 KiB
60Elfogadva259ms107288 KiB
61Elfogadva115ms94832 KiB
62Elfogadva284ms115172 KiB
63Elfogadva115ms95404 KiB
64Időlimit túllépés423ms114160 KiB
65Elfogadva122ms96284 KiB
66Elfogadva116ms95328 KiB
67Elfogadva114ms95656 KiB
68Elfogadva111ms94292 KiB
69Elfogadva314ms109256 KiB
70Időlimit túllépés469ms40756 KiB