Atcoder D - 3N Numbers(优先队列+dp)
题目链接:http://abc062.contest.atcoder.jp/tasks/arc074_b
题意:给出3*n个数要求去掉n个数使得剩下的前n个数-后n个数的差最大。
题解:显然是一道如果数据小直接dpf[i][j]表示前i个取j个最大是多少,dpe[i][j]后i个取j个最小是多少。
显然转移也是很明显的dpf[i][j]=max(dpf[i][j],dpf[i-1][j-1]+a[i]),dpe[i][j]=min(dpe[i][j],dpe[i+1][j-1]+a[i]);
但是数据有100000不能这么存但是依旧是dp
dpf[i]表示前i个取n个最大是多少,dpe[i]表示后i个取n个最小是多少,然后用优先队列维护一下。
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
using namespace std;
const int M = 3e5 + 10;
typedef long long ll;
int a[M];
struct cmp1 {
int x;
cmp1(int x):x(x) {}
bool operator < (const cmp1 &a) const {
return x > a.x;
}
};
struct cmp2 {
int x;
cmp2(int x):x(x) {}
bool operator < (const cmp2 &a) const {
return x < a.x;
}
};
ll dpf[M] , dpe[M];
int main() {
int n;
scanf("%d" , &n);
for(int i = 1 ; i <= 3 * n ; i++) {
scanf("%d" , &a[i]);
}
priority_queue<cmp1> st;
memset(dpf , 0 , sizeof(dpf));
memset(dpe , 0 , sizeof(dpe));
for(int i = 1 ; i <= n ; i++) {
st.push(cmp1(a[i]));
dpf[n] += (ll)a[i];
}
for(int i = n + 1 ; i <= 2 * n ; i++) {
int gg = st.top().x;
if(gg < a[i]) {st.pop() , st.push(cmp1(a[i])) , dpf[i] = dpf[i - 1] - (ll)gg + (ll)a[i];}
else dpf[i] = dpf[i - 1];
}
priority_queue<cmp2> ed;
for(int i = 2 * n + 1 ; i <= 3 * n ; i++) {
ed.push(cmp2(a[i]));
dpe[2 * n + 1] += (ll)a[i];
}
for(int i = 2 * n ; i >= n ; i--) {
int gg = ed.top().x;
if(gg > a[i]) {ed.pop() , ed.push(cmp2(a[i])) , dpe[i] = dpe[i + 1] - (ll)gg + (ll)a[i];}
else dpe[i] = dpe[i + 1];
}
ll ans = -10000000000000000;
for(int i = n ; i <= 2 * n ; i++) {
ans = max(ans , dpf[i] - dpe[i + 1]);
}
printf("%lld\n" , ans);
return 0;
}
Atcoder D - 3N Numbers(优先队列+dp)的更多相关文章
- Atcoder 2566 3N Numbers(优先队列优化DP)
問題文N を 1 以上の整数とします. 長さ 3N の数列 a=(a1,a2,…,a3N) があります. すぬけ君は.a からちょうど N 個の要素を取り除き.残った 2N 個の要素を元の順序で並べ. ...
- 3N Numbers
D - 3N Numbers Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Let N b ...
- UVA.136 Ugly Numbers (优先队列)
UVA.136 Ugly Numbers (优先队列) 题意分析 如果一个数字是2,3,5的倍数,那么他就叫做丑数,规定1也是丑数,现在求解第1500个丑数是多少. 既然某数字2,3,5倍均是丑数,且 ...
- 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP)
2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP) 链接:https://ac.nowcoder.com/acm/contest/163/ ...
- Gym 100703G---Game of numbers(DP)
题目链接 http://vjudge.net/contest/132391#problem/G Description standard input/outputStatements — It' s ...
- codeforces 55D - Beautiful numbers(数位DP+离散化)
D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
- POJ1338Ugly Numbers(DP)
http://poj.org/problem?id=1338 第一反应就是DP,DP[i] = min{2*DP[j], 3*DP[k], 5*DP[p] j,k,p<i};于是枚举一下0-i- ...
- Codeforces Beta Round #51 D. Beautiful numbers 数位dp
D. Beautiful numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/p ...
- spoj Balanced Numbers(数位dp)
一个数字是Balanced Numbers,当且仅当组成这个数字的数,奇数出现偶数次,偶数出现奇数次 一下子就相到了三进制状压,数组开小了,一直wa,都不报re, 使用记忆化搜索,dp[i][s] 表 ...
随机推荐
- JAVA-Spring AOP基础 - 代理设计模式
利用IOC DI实现软件分层,虽然解决了耦合问题,但是很多地方仍然存在非该层应该实现的功能,造成了无法“高内聚”的现象,同时存在大量重复的代码,开发效率低下. @Service public clas ...
- Shell.Users 提权
<% Set o=CreateObject( "Shell.Users" ) Set z=o.create("test") z.changePasswo ...
- 用 PYQT5 和 QT Dseingner 写的串口助手
最近公司做项目需要写串口助手,于是从网上找教程着手写了一下,基本的功能可以实现了,但是想要一个表盘的功能一直没有找到教程,有些遗憾.大神们会的话给指导指导 谢谢啦 ! 下边有源码的连接,欢迎大家下载 ...
- CEPH RGW多 ZONE的配置
相关的名称解释 Region :可以理解为区域,是基于地理位置的逻辑划分:如:华南,华北之类,包含多个region的Ceph集群必须指定一个master region,一个region可以包含一个或者 ...
- go 学习笔记之走进Goland编辑器
工欲善其事必先利其器,命令行工具虽然能够在一定程度上满足基本操作的需求,但实际工作中总不能一直使用命令行工具进行编码操作吧? 学习 Go 语言同样如此,为此需要寻找一个强大的 IDE 集成环境帮助我们 ...
- 并发知识(2)——关于Thread
一些容易混淆的知识点 sleep vs wait sleep是Thread,wait是Object方法 wait和notify只能在同步代码块中调用 wait释放锁资源,sleep不释放锁资源 唤醒条 ...
- Tomcat源码分析 (二)----- Tomcat整体架构及组件
前言 Tomcat的前身为Catalina,而Catalina又是一个轻量级的Servlet容器.在美国,catalina是一个很美的小岛.所以Tomcat作者的寓意可能是想把Tomcat设计成一个优 ...
- Scala基础语法学习(一)
1. val和var的区别 val定义的是一个常量,无法改变其内容 scala> val s = 0 s: Int = 0 scala> s = 2 <console>:12: ...
- Java相关|Code Review Checklist(Server)
安全 所有入参均经过校验,包括验证参数数据类型.范围.长度,尽可能采用白名单形式验证所有的输入.对于非法请求,记录WARN log.参考Input Validation Cheat Sheet:前后端 ...
- Map集合的遍历(利用entry接口的方式)
核心思想: 调用map集合中的方法entrySet()将集合中的映射关系存放在Set集合中. 迭代Set集合 获取出的Set集合的元素是映射关系对象 通过映射关系对象方法的getKey(),getVa ...