BZOJ2288 生日礼物
本题是数据备份的进阶版。
首先去掉所有0,把连续的正数/负数连起来。
计算所有正数段的个数与总和。
然后考虑数据备份,有一点区别:
如果我们在数列中选出一个负数,相当于把它左右连起来。
选出一个正数,相当于抛弃它。
总和加上那个负数/减去那个正数即为变化。
所以把val按照绝对值进堆,出来,减去绝对值即可。
注意:两边的负数不能选,因为旁边没有东西去给你连。
实际操作的时候我存了负数,在比较函数里加abs
#include <cstdio>
#include <queue>
#include <cmath>
const int N = ; struct Sta {
int p, val;
Sta(int pq, int v) {
p = pq;
val = v;
}
};
inline int abs(const int &x) {
return x > ? x : -x;
}
inline bool operator <(const Sta &x, const Sta &y) {
return abs(x.val) > abs(y.val);
}
struct ListNode {
int pre, nex, val;
bool use;
}li[N << ]; int top, head, tail; int a[N], ans, cnt;
std::priority_queue<Sta> Q; inline void init() {
head = (N << ) - ;
tail = head - ;
li[head].nex = tail;
li[tail].pre = head;
return;
} inline void add(int x) {
top++;
int p = li[tail].pre;
li[top].pre = p;
li[top].nex = tail;
li[p].nex = top;
li[tail].pre = top;
li[top].val = x;
Q.push(Sta(top, x));
if(x > ) {
ans += x;
cnt++;
}
return;
} inline int get() {
Sta t = Q.top();
Q.pop();
while(!Q.empty() && (li[t.p].use || li[t.p].val != t.val)) {
t = Q.top();
Q.pop();
}
int x = t.p; if(li[x].val < && li[x].pre == head) {
li[x].use = ;
li[li[x].nex].pre = head;
li[head].nex = li[x].nex;
return get();
}
if(li[x].val < && li[x].nex == tail) {
li[x].use = ;
li[tail].pre = li[x].pre;
li[li[x].pre].nex = tail;
return get();
} if(li[x].nex == tail && li[x].pre == head) {
li[x].use = ;
return li[x].val;
}
if(li[x].nex == tail) {
int ans = li[x].val;
li[x].val += li[li[x].pre].val;
li[li[x].pre].use = ;
li[x].pre = li[li[x].pre].pre;
li[li[x].pre].nex = x;
Q.push(Sta(x, li[x].val));
return ans;
}
if(li[x].pre == head) {
int ans = li[x].val;
li[x].val += li[li[x].nex].val;
li[li[x].nex].use = ;
li[x].nex = li[li[x].nex].nex;
li[li[x].nex].pre = x;
Q.push(Sta(x, li[x].val));
return ans;
}
int ans = li[x].val;
li[x].val += li[li[x].nex].val;
li[x].val += li[li[x].pre].val;
li[li[x].pre].use = ;
li[li[x].nex].use = ;
li[x].pre = li[li[x].pre].pre;
li[x].nex = li[li[x].nex].nex;
li[li[x].pre].nex = x;
li[li[x].nex].pre = x;
Q.push(Sta(x, li[x].val));
return ans;
} int main() {
int m, n;
init();
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
}
int t = ;
bool f = ;
for(int i = ; i <= n; i++) {
if(!a[i]) {
continue;
}
if(f) {
if(a[i] < ) {
continue;
}
else {
f = ;
}
}
if(1ll * a[i] * t >= ) {
t += a[i];
}
else {
add(t);
t = a[i];
}
}
if(t > ) {
add(t);
} for(int i = m + ; i <= cnt; i++) {
ans -= abs(get());
}
printf("%d", ans);
return ;
}
AC代码
BZOJ2288 生日礼物的更多相关文章
- bzoj2288 生日礼物 (线段树)
我当然想选最大的子段和啦 但要选M次 那不一定就是最好的 所以提供一个反悔的选项,我选了一段以后,就把它们乘个-1,然后再选最好的(类似于网络流的思路) 这个可以用线段树来维护,记一个区间包含左端点/ ...
- 2018.09.30 bzoj2288:生日礼物(贪心+线段树)
传送门 线段树经典题目. 每次先找到最大子段和来更新答案,然后利用网络流反悔退流的思想把这个最大字段乘-1之后放回去. 代码: #include<bits/stdc++.h> #defin ...
- 我的刷题单(8/37)(dalao珂来享受切题的快感
P2324 [SCOI2005]骑士精神 CF724B Batch Sort CF460C Present CF482A Diverse Permutation CF425A Sereja and S ...
- bzoj2288【POJ Challenge】生日礼物*
bzoj2288[POJ Challenge]生日礼物 题意: 给一个序列,求不超过m个连续的部分,使元素和最大.序列大小≤100000 题解: 先把连续的正数和负数合并起来,接着如果正数个数小于m则 ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
- [bzoj2288][pojChallenge]生日礼物【贪心+堆+链表】
题目描述 ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, -, AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知 ...
- BZOJ2288:[POJ Challenge]生日礼物——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2288 ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, . ...
- 【BZOJ2288】生日礼物 [贪心]
生日礼物 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description ftiasch 18岁生日的时候, ...
- BZOJ2288 【POJ Challenge】生日礼物 【堆 + 链表】
题目 ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知 ...
随机推荐
- C#Note13:如何在C#中调用python
前言 IronPython 是一种在 .NET 及 Mono上的 Python 实现,由微软的 Jim Hugunin(同时也是 Jython 创造者) 所发起,是一个开源的项目,基于微软的 DLR ...
- Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念(转)
PO(persistant object) 持久对象 在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了.通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理.可以 ...
- 用 Python 写一个多进程兼容的 TimedRotatingFileHandler
我前面有篇文章已经详细介绍了一下 Python 的日志模块.Python 提供了非常多的可以运用在各种不同场景的 Log Handler. TimedRotatingFileHandler 是 Pyt ...
- SWT 几个sample网站
https://www.programcreek.com/java-api-examples/org.eclipse.swt.custom.ScrolledComposite https://o7pl ...
- ubuntu 完全卸载mysql
卸载 sudo apt-get --purge remove mysql-common -y sudo apt-get --purge remove mysql* -y sudo apt-get au ...
- TField OnValidate 事件
Occurs just before the data is written to the record buffer. Write an OnValidate event handler to va ...
- 循环神经网络RNN及LSTM
一.循环神经网络RNN RNN综述 https://juejin.im/entry/5b97e36cf265da0aa81be239 RNN中为什么要采用tanh而不是ReLu作为激活函数? htt ...
- Python——tkinter操作
一.创建单选框 form tkinter import * #创建窗口体 window = tk() #初始化组合件绑定 w1 = IntVar() #设置初始选择项1 w1.set(1) def O ...
- 【python练习题】程序17
#题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. s = input('请输入字符串:') alf = 0 space = 0 digi = 0 other = 0 for ...
- Hibernate中的Entity类之间的继承关系之一MappedSuperclass
在hibernate中,Entity类可以继承Entity类或非Entity类.但是,关系数据库表之间不存在继承的关系.那么在Entity类之间的继承关系,在数据库表中如何表示呢? Hibernate ...