1 条题解

  • 0
    @ 2024-2-1 16:53:31
    **#**include** **<algorithm>
    **#**include** **<queue>
    **#**include** **<vector>
    using namespace std**;**
    **const**  **int** N**=**100010**;**
    **typedef** pair**<**int **,**int **>** PII**;**
    **int** a**[**N**]**;
    **int** l**[**N**]**,r**[**N**]**;**//链表中标记左右位置的数组**
    **int** n**,**m**;**
    bool st**[**N**]**;**//当弹出某一位置元素时,可能会影响到其他位置的元素的选择情况**
    **void** **remove**(**int** p**)**
    **{**
    	l**[**r**[**p**]**]**=**l**[**p**]**;
    	r**[**l**[**p**]**]**=**r**[**p**]**;
    	st**[**p**]**=true**;**
    **}**
    **int** **main**(**)**
    **{**
    	cin**>>**n**>>**m**;**
    	**int** k**=**1**;**
    	**for**(**int** i**=**1**;**i**<=**n**;**i**++**)
    	**{**
    		**int** x**;**
    		cin**>>**x**;**
    		**if**(**(**long **long** **)**a**[**k**]***x**<**0**)**a**[**++k**]**=x**;**//将相邻且相同符号的元素合并
    		**else** a**[**k**]**+**=**x**;**
    	**}**
        
        **int** cnt**=**0**,**res**=**0**;**
        priority_queue**<**PII**,**vector**<**PII **>** **,**greater**<**PII **>** **>**heap**;**
        n**=**k**;**//将合并后的边界更新
        **for**(**int** i**=**1**;**i**<=**k**;**i**++**)
        **{**
        	l**[**i**]**=i**-**1**;**
        	r**[**i**]**=i**+**1**;**//初始化相邻数组
            **if**(a**[**i**]**>**0**)
            **{**//首先我们得到所有正数的和,即最大值
            	cnt**++**;
            	res**+**=a**[**i**]**;
            **}**
            heap**.**push**(**{**abs**(a**[**i**]**)**,**i**}**)**;**
        **}**
    
        **while**(cnt**>**m**)**
        **{**//当我们选中的所有正数的个数(即连续的正数序列的个数)超过要求时
        	**//我们就要在其中有选择的去除一些**
        	**while**(st**[**heap**.**top**(**)**.**second**]**)heap**.**pop**(**)**;**
        	**//当我们堆顶元素位置被标记为删除时,我们在小顶堆中将其删除**
        	**auto** t**=**heap**.**top**(**)**;**
        	heap**.**pop**(**)**;**//我们获得当前绝对值最小的元素,将其删除
    
            **int** v**=**t**.**first**,**p**=**t**.**second**;**
            **int** left**=**l**[**p**]**,right**=**r**[**p**]**;
            **if**(left**>**0**&&**right**<**n**+**1**||**a**[**p**]**>**0**)
            **{**
            	cnt**--**;
            	res**-**=v**;**
            	a**[**p**]**+**=**a**[**left**]**+a**[**right**]**;
            	**remove**(left**)**;
            	**remove**(right**)**;
            	heap**.**push**(**{**abs**(a**[**p**]**)**,**p**}**)**;**
            **}**
        **}**
       cout**<<**res**<<**endl**;**
       **return** **0**;
    **}**
    
    • 1

    信息

    ID
    74
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    29
    已通过
    13
    上传者