Submission #72560401


Source Code Expand

import sys
import string
import math
import bisect
import os
import heapq
import operator
from io import BytesIO, IOBase
from heapq import heappop,heappush
from functools import lru_cache,cache
from copy import copy,deepcopy
from collections import deque,defaultdict,Counter
from itertools import permutations,combinations
from array import array


INF = float('inf')
BUFSIZE = 8192

class FastIO(IOBase):
    newlines = 0
 
    def __init__(self, file):
        self._file = file
        self._fd = file.fileno()
        self.buffer = BytesIO()
        self.writable = "x" in file.mode or "r" not in file.mode
        self.write = self.buffer.write if self.writable else None
 
    def read(self):
        while True:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            if not b:
                break
            ptr = self.buffer.tell()
            self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
        self.newlines = 0
        return self.buffer.read()
 
    def readline(self):
        while self.newlines == 0:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            self.newlines = b.count(b"\n") + (not b)
            ptr = self.buffer.tell()
            self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
        self.newlines -= 1
        return self.buffer.readline()
 
    def flush(self):
        if self.writable:
            os.write(self._fd, self.buffer.getvalue())
            self.buffer.truncate(0), self.buffer.seek(0)
 
class IOWrapper(IOBase):
    def __init__(self, file):
        self.buffer = FastIO(file)
        self.flush = self.buffer.flush
        self.writable = self.buffer.writable
        self.write = lambda s: self.buffer.write(s.encode("ascii"))
        self.read = lambda: self.buffer.read().decode("ascii")
        self.readline = lambda: self.buffer.readline().decode("ascii")
 
sys.stdin, sys.stdout = IOWrapper(sys.stdin), IOWrapper(sys.stdout)
input = sys.stdin.buffer.readline

ask = lambda *x:print('?',*x,flush=True)
reply = lambda *x:print('!',*x,flush=True)

RI = lambda: int(sys.stdin.readline())
RF = lambda: float(sys.stdin.readline())
RS = lambda: sys.stdin.readline().strip()
RFF = lambda: map(float, sys.stdin.readline().split())
RII = lambda: map(int, sys.stdin.readline().split())
RSS = lambda: map(str, sys.stdin.readline().strip().split())
RIL = lambda: list(RII())
RFL = lambda: list(RFF())
RSL = lambda: list(RSS())

from types import GeneratorType
def bootstrap(f, stack=[]):
    def wrappedfunc(*args, **kwargs):
        if stack:
            return f(*args, **kwargs)
        else:
            to = f(*args, **kwargs)
            while True:
                if type(to) is GeneratorType:
                    stack.append(to)
                    to = next(to)
                else:
                    stack.pop()
                    if not stack:
                        break 
                    to = stack[-1].send(to)
            return to

    return wrappedfunc

class LazySegmentTree:
    def __init__(self, A):
        self.n = len(A)
        self.A = A
        self.N = self.n * 4
        self.S = [self.Node() for _ in range(self.N)]
        self.build(0, self.n - 1, 1)
    
    class Node:
        def __init__(self):
            """ 放默认值 """
            self.f = 0  # max
            self.g = 0  # count
            self.ll = 1
            self.l1 = 0
            self.l2 = False
    
    def modify_leaf(self, a: Node, i):
        """ 根据 A[i] 修改叶子 """
        a.f = self.A[i]
        
    def merge(self, a: Node,b: Node,c: Node):
        """ 将 b,c 的信息合并到 a """
        a.f = max(b.f,c.f)
        a.ll = b.ll+c.ll
        a.g = b.g+c.g
    
    def pushdown(self, a: Node,b: Node,c: Node):
        """ 将 a 的懒惰信息下传到 b,c """
        if a.l2==True:
            b.g = b.ll-b.g
            c.g = c.ll-c.g
            b.f = 0
            c.f = 0
            b.l1 = 0
            c.l1 = 0
            b.l2 = True
            c.l2 = True
            a.l2 = False
        if a.l1!=0:
            b.l1 += a.l1
            c.l1 += a.l1
            if b.g!=b.ll:
                b.f += a.l1
            if c.g!=c.ll:
                c.f += a.l1
            a.l1 = 0
    
    def build(self, l, r, p):
        if l == r:
            self.modify_leaf(self.S[p], l)
            return
        m = (l + r) >> 1
        self.build(l, m, p << 1)
        self.build(m + 1, r, p << 1 | 1)
        self.merge(self.S[p], self.S[p << 1], self.S[p << 1 | 1])
    
    def update1(self ,x, y, val):
        """ 更新位置 [x,y] 的节点 """
        if x>y:
            return
        self._update1(x, y, 0, self.n-1, 1, val)
    
    def _update1(self, x, y, l, r, p:int, val):
        if r-l+1>=2:
            self.pushdown(self.S[p], self.S[p << 1], self.S[p << 1 | 1])
            m = (l + r) >> 1
            pp = p<<1
            if m-l+1>=2:
                self.pushdown(self.S[pp], self.S[pp << 1], self.S[pp << 1 | 1])
            pp = p<<1|1
            if r-(m+1)+1>=2:
                self.pushdown(self.S[pp], self.S[pp << 1], self.S[pp << 1 | 1])
        if x <= l and y >= r:
            """ 这里写相应的区间修改 """
            if self.S[p].g<self.S[p].ll:
                self.S[p].f += val
                self.S[p].l1 += val
            return
        m = (l + r) >> 1
        if x <= m:
            self._update1(x, y, l, m, p << 1, val)
        if y >= m + 1:
            self._update1(x, y, m + 1, r, p << 1 | 1, val)
        self.merge(self.S[p], self.S[p << 1], self.S[p << 1 | 1])

    def update2(self ,x, y):
        """ 更新位置 [x,y] 的节点 """
        if x>y:
            return
        self._update2(x, y, 0, self.n-1, 1)
    
    def _update2(self, x, y, l, r, p:int):
        if r-l+1>=2:
            self.pushdown(self.S[p], self.S[p << 1], self.S[p << 1 | 1])
            m = (l + r) >> 1
            pp = p<<1
            if m-l+1>=2:
                self.pushdown(self.S[pp], self.S[pp << 1], self.S[pp << 1 | 1])
            pp = p<<1|1
            if r-(m+1)+1>=2:
                self.pushdown(self.S[pp], self.S[pp << 1], self.S[pp << 1 | 1])
        if x <= l and y >= r:
            """ 这里写相应的区间修改 """
            self.S[p].g = self.S[p].ll-self.S[p].g
            self.S[p].l2 = True
            self.S[p].l1 = 0
            self.S[p].f = 0
            return
        m = (l + r) >> 1
        if x <= m:
            self._update2(x, y, l, m, p << 1)
        if y >= m + 1:
            self._update2(x, y, m + 1, r, p << 1 | 1)
        self.merge(self.S[p], self.S[p << 1], self.S[p << 1 | 1])

    def query(self, x, y):
        """ 查询区间[x, y]的信息 """
        return self._query(x,y,0,self.n-1,1)
    
    def _query(self, x, y, l, r, p):
        if x <= l and y >= r:
            return self.S[p]
        
        m = (l + r) >> 1
        self.pushdown(self.S[p], self.S[p << 1], self.S[p << 1 | 1])
        b = self.Node()
        c = self.Node()
        if x <= m:
            b = self._query(x, y, l, m, p << 1)
        if y >= m + 1:
            c = self._query(x, y, m + 1, r, p << 1 | 1)
        
        a = self.Node()
        self.merge(a, b, c)
        return a

def main():
    n,q = RII()
    
    a = [0]*(n+1)
    
    d = LazySegmentTree(a)
    
    for _ in range(q):
        inp = RIL()
        
        if inp[0]==1:
            l,r,x = inp[1:]
            l -= 1
            r -= 1
            d.update1(l,r,x)
        if inp[0]==2:
            l,r = inp[1:]
            l -= 1
            r -= 1
            d.update2(l,r)
        if inp[0]==3:
            l,r = inp[1:]
            l -= 1
            r -= 1
            ans = d.query(l,r).f
            print(ans)
    
if __name__ == '__main__':
    main()

                

Submission Info

Submission Time
Task G - Takoyaki and Flip
User x3x3
Language Python (PyPy 3.11-v7.3.20)
Score 0
Code Size 8125 Byte
Status WA
Exec Time > 2000 ms
Memory 227340 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 575
Status
AC × 3
AC × 10
WA × 20
TLE × 35
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_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 01_random_25.txt, 01_random_26.txt, 01_random_27.txt, 01_random_28.txt, 01_random_29.txt, 01_random_30.txt, 01_random_31.txt, 01_random_32.txt, 01_random_33.txt, 01_random_34.txt, 01_random_35.txt, 01_random_36.txt, 01_random_37.txt, 01_random_38.txt, 01_random_39.txt, 01_random_40.txt, 01_random_41.txt, 01_random_42.txt, 01_random_43.txt, 01_random_44.txt, 01_random_45.txt, 01_random_46.txt, 01_random_47.txt, 01_random_48.txt, 01_random_49.txt, 01_random_50.txt, 01_random_51.txt, 01_random_52.txt, 01_random_53.txt, 01_random_54.txt, 01_random_55.txt, 01_random_56.txt, 01_random_57.txt, 01_random_58.txt, 01_random_59.txt, 01_random_60.txt, 01_random_61.txt, 01_random_62.txt, 01_random_63.txt, 01_random_64.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 112 ms 110136 KiB
00_sample_01.txt AC 115 ms 109984 KiB
00_sample_02.txt AC 116 ms 110072 KiB
01_random_03.txt TLE > 2000 ms 225276 KiB
01_random_04.txt TLE > 2000 ms 224728 KiB
01_random_05.txt TLE > 2000 ms 225920 KiB
01_random_06.txt TLE > 2000 ms 225624 KiB
01_random_07.txt TLE > 2000 ms 225240 KiB
01_random_08.txt TLE > 2000 ms 225756 KiB
01_random_09.txt TLE > 2000 ms 225364 KiB
01_random_10.txt TLE > 2000 ms 225632 KiB
01_random_11.txt TLE > 2000 ms 225512 KiB
01_random_12.txt TLE > 2000 ms 225244 KiB
01_random_13.txt TLE > 2000 ms 225244 KiB
01_random_14.txt TLE > 2000 ms 225256 KiB
01_random_15.txt TLE > 2000 ms 225420 KiB
01_random_16.txt WA 1197 ms 155592 KiB
01_random_17.txt WA 1972 ms 153944 KiB
01_random_18.txt WA 1719 ms 179928 KiB
01_random_19.txt WA 1748 ms 164480 KiB
01_random_20.txt WA 1803 ms 167868 KiB
01_random_21.txt TLE > 2000 ms 150924 KiB
01_random_22.txt WA 671 ms 197536 KiB
01_random_23.txt WA 695 ms 138144 KiB
01_random_24.txt TLE > 2000 ms 225832 KiB
01_random_25.txt TLE > 2000 ms 226728 KiB
01_random_26.txt TLE > 2000 ms 227092 KiB
01_random_27.txt TLE > 2000 ms 226628 KiB
01_random_28.txt TLE > 2000 ms 225788 KiB
01_random_29.txt TLE > 2000 ms 226652 KiB
01_random_30.txt TLE > 2000 ms 226276 KiB
01_random_31.txt TLE > 2000 ms 226576 KiB
01_random_32.txt WA 1232 ms 172716 KiB
01_random_33.txt WA 1691 ms 196612 KiB
01_random_34.txt WA 1614 ms 142400 KiB
01_random_35.txt WA 1287 ms 158752 KiB
01_random_36.txt WA 1782 ms 203592 KiB
01_random_37.txt TLE > 2000 ms 226700 KiB
01_random_38.txt TLE > 2000 ms 226764 KiB
01_random_39.txt TLE > 2000 ms 227340 KiB
01_random_40.txt TLE > 2000 ms 226612 KiB
01_random_41.txt TLE > 2000 ms 227016 KiB
01_random_42.txt TLE > 2000 ms 226892 KiB
01_random_43.txt TLE > 2000 ms 227016 KiB
01_random_44.txt TLE > 2000 ms 227224 KiB
01_random_45.txt WA 1437 ms 203964 KiB
01_random_46.txt WA 1258 ms 177092 KiB
01_random_47.txt WA 1510 ms 203388 KiB
01_random_48.txt WA 1805 ms 145244 KiB
01_random_49.txt WA 1158 ms 164100 KiB
01_random_50.txt AC 658 ms 213744 KiB
01_random_51.txt AC 675 ms 213356 KiB
01_random_52.txt AC 680 ms 213408 KiB
01_random_53.txt TLE > 2000 ms 225356 KiB
01_random_54.txt TLE > 2000 ms 224340 KiB
01_random_55.txt TLE > 2000 ms 224988 KiB
01_random_56.txt TLE > 2000 ms 224992 KiB
01_random_57.txt TLE > 2000 ms 224932 KiB
01_random_58.txt WA 1395 ms 162612 KiB
01_random_59.txt WA 1402 ms 190224 KiB
01_random_60.txt WA 1413 ms 220552 KiB
01_random_61.txt AC 1336 ms 217512 KiB
01_random_62.txt AC 1407 ms 215892 KiB
01_random_63.txt AC 1460 ms 215820 KiB
01_random_64.txt AC 167 ms 117304 KiB