这题看别人题解的

这题说可以转换成数据备份。
这题可以把一段同号的数并成一个数,那么就变成了一个正负交替的序列,然后把头尾的负数去掉。
然后就是把所有的正值都加起来,并统计正数的段数cnt,如cnt<=m,那么这些整数的和就是答案

如果cnt>m,那我们就要不断地去掉一段,直到cnt=m

先把所有数的绝对值加进优先队列,每次去一个最小的出来然后减掉,最后的即为答案。
为什么是正确的呢?因为如果减去的值在原数列中为正则相当于不要这个数,否则就相当于选了这个负数然后把两边的正值合并起来。

无论减去正数还是负数,都要保证每次操作能够使段数cnt-1,这是我们的目的所在

既如果去掉的是正数,保证了cnt-1,如果去掉了负数,那么要保证它的两边必须要是正数,这样才能使旁边两个正数加上这个负数,使得我们原来取的它的旁边的两段正数加上这个负数后,段数减一,所以处于左右端点的负数都要先去掉
但有一个问题,就是若选了一个数那么其两边的数就必定不能被选,那么就转换成了数据备份了。

真的是被这题搞得快自闭了,自己写的一直wa,经过不断修改代码,两个代码来回交,大概交了40次,才发现我哪里错了

错的l[pos] = l[l[pos]];
r[pos] = r[r[pos]];
r[l[l[pos]]] = pos;
l[r[r[pos]]] = pos;

这个是导致我WA了20次的原因,怎么也没想到是这个地方错了,我还在疯狂修改其他地方。

对的
r[l[l[pos]]] = pos;
l[r[r[pos]]] = pos;
l[pos] = l[l[pos]];
r[pos] = r[r[pos]];

原来错的那个我的 l[pos] 已经先更改过了。

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int maxn = 1e5 + 5;
int a[maxn], l[maxn], r[maxn],n,m,ans,cnt;
bool vis[maxn];
struct data
{int val, pos;data(int val1 = 0, int pos1 = 0) { val = val1; pos = pos1; }bool operator < (const data &a) const{return a.val<val;}
};
priority_queue<data> que;
int main()
{cin >> n >> m;int tot = 1;for (int i = 1; i <= n; i++){int tmp;cin >> tmp;if (a[tot] * tmp >= 0) a[tot] += tmp;else a[++tot] = tmp;}int left = 1;if (a[1]<0) left++;if (a[tot]<0) tot--;for (int i = left; i <= tot; i++){if (a[i] > 0) cnt++, ans += a[i];a[i] = abs(a[i]);que.push(data(a[i],i));//que.push(data(a[i],i));l[i] = i - 1;r[i] = i + 1;}l[left]=r[tot] = 0;if (cnt <= m) cout << ans << endl;else{int num = cnt - m;for (int i = 1; i <= num;i++){while (vis[que.top().pos] && !que.empty())  que.pop();int pos = que.top().pos;que.pop();ans -= a[pos];if (!l[pos]) {vis[pos] = vis[r[pos]] = true;l[r[r[pos]]] = 0;}else if (!r[pos]){vis[pos] = vis[l[pos]]=true;r[l[l[pos]]] = 0;}else{vis[l[pos]] = vis[r[pos]] = true;a[pos] = a[l[pos]] + a[r[pos]] - a[pos];que.push(data(a[pos],pos));r[l[l[pos]]] = pos;l[r[r[pos]]] = pos;l[pos] = l[l[pos]];r[pos] = r[r[pos]];}}cout << ans << endl;}return 0;
}

View Code

转载于:https://www.cnblogs.com/xiaoguapi/p/10371599.html

BZOJ 2288: 【POJ Challenge】生日礼物 优先队列+贪心+链表相关推荐

  1. poj 3614 Sunscreen(优先队列+贪心)

    Description To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her ...

  2. BZOJ 2287 POJ Challenge 消失之物

    BZOJ题目不完整,看了看题解.发现他们都要取模10,还以为是dp的限制. 改了两小时,之后猛然发现.卧槽原本我少了一个取模. 写法1:暴力写法 最简单的想法(只要你会背包dp) 我在枚举每次不选哪个 ...

  3. 【BZOJ2288】[POJ Challenge]生日礼物(线段树)

    题目来源:BZOJ2288 如果 m=1m=1m=1 我们只需要求最大子段和即可. 但是当 m>1m>1m>1 时,我们的选取可能会产生后效性. 比如说黄色部分是选取一个子段的最优方 ...

  4. BZOJ 2287 【POJ Challenge】消失之物

    2287: [POJ Challenge]消失之物 Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. &q ...

  5. bzoj2287【POJ Challenge】消失之物 缺一01背包

    bzoj2287[POJ Challenge]消失之物 缺一01背包 链接 bzoj 思路 分治solve(l,r,arr)表示缺少物品\([l,r]\)的dp数组arr. 然后solve(l,mid ...

  6. 2287. 【POJ Challenge】消失之物(数组递推\分治优化背包)

    2287. [POJ Challenge]消失之物 这题的思想和P4564 [CTSC2018]假面优化的思想一样,应该反过来说,假面那个题应该是借鉴这题的思路. 显然不能枚举每个物品消失O(n)O( ...

  7. LeetCode 1642. 可以到达的最远建筑(二分查找 / 优先队列贪心)

    文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 优先队列+贪心 1. 题目 给你一个整数数组 heights ,表示建筑物的高度.另有一些砖块 bricks 和梯子 ladders . 你 ...

  8. 【CF 732E】Sockets(优先队列+贪心)

    [CF 732E]Sockets(优先队列+贪心) 题目大意: n台电脑,m个供电器. 每台电脑和每个供电器都有电量,当电脑i的电量和供电器j电量相同时,可以连接供电. 现在提供变压器,可以连接到供电 ...

  9. bzoj2295【POJ Challenge】我爱你啊*

    bzoj2295[POJ Challenge]我爱你啊 题意: 求一个字符串中有多少个"luvletter"(不包括引号).字符串长度≤100000. 题解: 连kmp都不用-- ...

最新文章

  1. 日记 [2008年03月23日]LINUX网关后面的pptp ***客户机连接***
  2. FL的萌新之路,开始了!
  3. 【ArcGIS风暴】ArcGIS10.6获取栅格影像边界范围的三种方法案例详解
  4. 从Zabbix数据库中提取内存采集的数据,做内存使用率计算
  5. Cmake安装遇到问题
  6. Linux如何建立用户(组)及调整用户(组)属性(案列+详细指令)
  7. 11最接近target的值
  8. jQuery 的 ajax
  9. python 批量爬取网页pdf_批量抓取网页pdf文件
  10. 含耦合电感元件的电路分析
  11. IDEA git 切换分支产生问题
  12. java APP支付宝支付
  13. 新edge保持百度账号登录
  14. not authorized on test to execute command { $eval: \return 1111\
  15. 【YOLO】目标检测第三步——用Pascal voc 2012 数据集训练YOLO网络
  16. ftp 21端口被占用解决办法
  17. XPDF安装与使用说明
  18. 16个核心概念带你入门 Kubernetes
  19. 中兴V880手机的随机软件列表
  20. 浏览器DNS解析过程

热门文章

  1. Docker 加速器升级版
  2. Apache Wicket 7.2.0发布
  3. 某物流集团企业信息化案例介绍
  4. Zabbix配置文件详解之服务端——zabbix_server
  5. windows10下 tensorflow gpu版本安装配置方法
  6. python如何输出结果为16_python 以16进制打印输出的方法
  7. Web3.0网关Deeper Network计划于本月末在四个平台上进行IDO
  8. 济南市区块链产业创新发展行动计划对外公布
  9. SAP License:SAP 清帐介绍
  10. Kaggle 数据清洗挑战 Day 4 - 字符编码(Character Encoding)处理