1 条题解
-
0Lv1 (linxu) LV 7 @ 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
- 上传者