BZOJ 2288: 【POJ Challenge】生日礼物 贪心 + 堆 + 链表
2024-10-07 09:21:58
好像是模拟费用流
Code:
#include <bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define P pair<int,int>
#define ll long long
#define maxn 100007
using namespace std;
int arr[maxn],l[maxn],r[maxn],mark[maxn];
priority_queue<P, vector<P>, greater<P> >q;
void del(int x) {
l[r[x]]=l[x], r[l[x]]=r[x];
mark[x]=1;
}
int main() {
// setIO("input");
int n,m,tmp=0,cnt=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) {
int x;
scanf("%d",&x);
if(!x) continue;
if(1ll*arr[tmp]*x>0) arr[tmp]+=x;
else arr[++tmp]=x;
}
n=tmp;
int sum=0;
for(int i=1;i<=n;++i) {
l[i]=i-1,r[i]=i+1;
if(arr[i] > 0) ++cnt, sum+=arr[i];
q.push(make_pair(abs(arr[i]), i));
}
while(cnt > m) {
while(mark[q.top().second]) q.pop();
int x=q.top().second; q.pop();
if((l[x]&&r[x]!=n+1) || arr[x] > 0) {
sum-=abs(arr[x]);
arr[x]+=arr[l[x]] + arr[r[x]];
del(l[x]), del(r[x]);
--cnt;
q.push(make_pair(abs(arr[x]), x));
}
else del(x);
}
printf("%d\n",sum);
return 0;
}
最新文章
- js正则表达式中test,exec,match方法的区别
- GridView获取列子段的几种途径
- 【leetcode】Substring with Concatenation of All Words
- hdu 1348 Wall (凸包)
- 地图坐标转换 -- 火星坐标与GPS坐标
- 让IE支持max-width
- python学习笔记三--字典的使用
- DiscreteSeekBar使用简介,一个带气泡的SeekBar
- DEDE站点从网站根目录移到子目录
- DotNet命名规范参考(转)
- Python学习笔记 — 函数
- 安装PyQt5之后mayavi和VTK不能使用
- SOUI新组件SIpcObject介绍
- openTSDB (rpm)安装 + Grafana 视图
- CentOS7.0小随笔——运行级别
- 027-Session状态提供程序
- JavaScript 变量的作用域名
- 【ARM】arm系列知识框架
- 单细胞数据高级分析之构建成熟路径 | Identifying a maturation trajectory
- js判断用户是客户端还是移动端