传送门

Description

一个有N辆卡车的车队从城市Z驶向城市3,来到了一条叫做“恐惧隧道”的隧道。在卡车司机中,有传言说怪物DravDe在那条隧道里搜寻司机。有些司机害怕先走,而其他人则害怕后走。但让我们考虑一般情况,每辆卡车用四个数字描述:

•v,卡车的价值,包括乘客和货物
•c,乘客数量,包括司机本人
•l,当前辆卡车之前应该进入的隧道的总人数,这样,当前司机就可以克服他的恐惧(如果怪物出现在那辆车前面,它会先吃掉他们)
•r,当前辆卡车之后应该进入的隧道的总人数,这样,当前司机就可以克服他的恐惧(如果怪物出现在那辆车后面,它会先吃掉他们)

由于路面很窄,如果 DravDe 一旦出现,就不可能逃离。此外,车队不能重新安排。卡 车的顺序是不能改变的,但是有卡车会停留在隧道附近无限期。你,作为车队的头儿,应该 把一些卡车移走(是的,忽略这些卡车的价值),这样车队的其余部分可以通过隧道。求移 走一些卡车后,剩余卡车的总价值最大是多少。

Input

第一行是卡车个数\(n\)

下面\(n\)行,每行四个数,按照上述顺序给出卡车的四个参数

Output

共输出两行。第一行输出代表价值最大时剩余的卡车数量

第二行输出被选择的卡车编号。任意输出一种即可

Hint

\(0~\leq~v~\leq~10^4\),\(0~\leq~\)其他参数\(\leq~10^5\)

Solution

经过一番深思熟虑,我们发现对于同时被选择的两辆车,总的人数应该是\(c+r+l\)。于是得出结论,被同时选择的车上述参数和应该相同。

于是这告诉我们只有满足上述条件才能更新答案,以及对于一辆车,他所在的被选择的序列的人数应该是固定的。

显然这是一个线性DP。于是有转移方程\(f_i=\max\{f_j\}+v_i\),其中满足\(j\)的参数和与\(i\)相同,同时因为\(j\)在\(i\)的前面,于是有\(l_j+c_i=l_i\)。按照这个方程即可进行转移。每枚举到一个\(r=0\)的位置就可以更新答案。

Code

#include<map>
#include<cstdio>
#include<algorithm>
#define rg register
#define ci const int
#define cl const long long typedef long long int ll; template <typename T>
inline void qr(T &x) {
rg char ch=getchar(),lst=' ';
while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
if(lst == '-') x=-x;
} namespace IO {
char buf[120];
} template <typename T>
inline void qw(T x,const char aft,const bool pt) {
if(x < 0) {x=-x,putchar('-');}
rg int top=0;
do {IO::buf[++top]=x%10+'0';} while(x/=10);
while(top) putchar(IO::buf[top--]);
if(pt) putchar(aft);
} template <typename T>
inline T mmax(const T a,const T b) {return a > b ? a : b;}
template <typename T>
inline T mmin(const T a,const T b) {return a < b ? a : b;}
template <typename T>
inline T mabs(const T a) {return a < 0 ? -a : a;} template <typename T>
inline void mswap(T &_a,T &_b) {
T _temp=_a;_a=_b;_b=_temp;
} const int maxn = 400010; struct M {
int v,c,l,r,sum,pos;
inline bool operator<(const M &_others) const {
if(this->sum != _others.sum) return this->sum < _others.sum;
return this->pos < _others.pos;
}
};
M MU[maxn]; int n,ans;
int frog[maxn],pre[maxn],pcnt[maxn];
std::map<int,int>mp[maxn]; void dfs(ci); int main() {
qr(n);
for(rg int i=1;i<=n;++i) {
M &now=MU[i];
qr(now.v);qr(now.c);qr(now.l);qr(now.r);
now.sum=now.c+now.l+now.r;now.pos=i;
}
std::sort(MU+1,MU+1+n);
for(rg int i=1;i<=n;++i) {
int k;
if(!MU[i].l) {
frog[i]=MU[i].v;pcnt[i]=1;
}
else if((k=mp[MU[i].sum][MU[i].l]) != 0) {
frog[i]=frog[k]+MU[i].v;pre[i]=k;pcnt[i]=pcnt[k]+1;
}
if(frog[i] && (frog[i] > frog[mp[MU[i].sum][MU[i].c+MU[i].l]])) mp[MU[i].sum][MU[i].l+MU[i].c]=i;
if(!(MU[i].r) && (frog[ans] < frog[i])) ans=i;
}
qw(pcnt[ans],'\n',true);
dfs(ans);putchar('\n');
return 0;
} void dfs(ci x) {
if(!x) return;
dfs(pre[x]);
qw(MU[x].pos,' ',true);
}

Summary

在DP转移时,可以通过代数恒等式证明出一种正确的转移方法。

【神仙题】【CF28D】 Don't fear, DravDe is kind的更多相关文章

  1. CF28D Don't fear, DravDe is kind 背包

    题目传送门:http://codeforces.com/problemset/problem/28/D 题意:给你$N$个物品,每个物品有其价格$P_i$,之前必须要买的物品价格和$L_i$,之后必须 ...

  2. CF28D Don't fear, DravDe is kind

    传送门 题意:\(n\)个位置,每个位置有价值\(v_i\)和重量\(p_i\),要选出一些位置,如果要选位置\(i\),那么前面选的重量之和要为\(l_i\),后面选的重量之和要为\(r_i\),求 ...

  3. 【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)

    [BZOJ5285][HNOI2018]寻宝游戏(神仙题) 题面 BZOJ 洛谷 题解 既然是二进制按位的运算,显然按位考虑. 发现这样一个关系,如果是\(or\)的话,只要\(or\ 1\),那么无 ...

  4. 【BZOJ5213】[ZJOI2018]迷宫(神仙题)

    [BZOJ5213][ZJOI2018]迷宫(神仙题) 题面 BZOJ 洛谷 题解 首先可以很容易的得到一个\(K\)个点的答案. 构建\(K\)个点分别表示\(mod\ K\)的余数.那么点\(i\ ...

  5. 【BZOJ1071】[SCOI2007]组队(神仙题)

    [BZOJ1071][SCOI2007]组队(神仙题) 题面 BZOJ 洛谷 题解 首先把式子整理一下,也就是\(A*h+B*v\le C+A*minH+B*minV\) 我们正常能够想到的做法是钦定 ...

  6. 【agc006f】Blackout(神仙题)

    [agc006f]Blackout(神仙题) 翻译 给定一个\(n*n\)的网格图,有些格子是黑色的.如果\((x,y),(y,z)\)都是黑色的,那么\((y,x)\)也会被染黑,求最终黑格子数量. ...

  7. 【BZOJ3244】【NOI2013】树的计数(神仙题)

    [BZOJ3244][NOI2013]树的计数(神仙题) 题面 BZOJ 这题有点假,\(bzoj\)上如果要交的话请输出\(ans-0.001,ans,ans+0.001\) 题解 数的形态和编号没 ...

  8. 【bzoj2118&洛谷P2371】墨墨的等式(最短路神仙题)

    题目传送门:bzoj2118 洛谷P2371 这道题看了题解后才会的..果然是国家集训队的神仙题,思维独特. 首先若方程$ \sum_{i=1}^{n}a_ix_i=k $有非负整数解,那么显然对于每 ...

  9. P3202 [HNOI2009]通往城堡之路 神仙题

    这个题不是坑人吗...写个tarjan标签,然后拿这么个神仙题来搞...代码有点看不懂,有兴趣的可以去洛谷题解区看看,懒得想了. 题干: 题目描述 听说公主被关押在城堡里,彭大侠下定决心:不管一路上有 ...

  10. Codeforces & Atcoder神仙题做题记录

    鉴于Codeforces和atcoder上有很多神题,即使发呆了一整节数学课也是肝不出来,所以就记录一下. AGC033B LRUD Game 只要横坐标或者纵坐标超出范围就可以,所以我们只用看其中一 ...

随机推荐

  1. linux部署MantisBT(一)部署apache

    一.部署apache 1.下载apache安装包及依赖包 http://httpd.apache.org/download.cgi#apache24(apache2)http://apr.apache ...

  2. 美国末日AI System设计分享

    引言 好久没有写博客了,这半年在游戏公司工作,过得比较充实,每天不是add feature就是debug,所以忽视了写博客.今天发一篇关于AI博客. 主要是最近看了一些关于"The Last ...

  3. 模拟IDE上的run过程

    看了一下老陈写的模仿JDK动态代理,从中取一部分单独扩展,模拟一下IDE上的run过程(不愧是老陈,去年写的东西我要现在才能理解) 对run过程的猜想 在点击run的过程中应该做了不少事.先编译运行r ...

  4. windows下sublime text的node.js开发环境搭建

    首先安装sublime text3,百度一堆,自己找吧.理论上sublime text2应该也可以.我只能说一句:这个软件实在是太强悍了. 跨平台,丰富的插件体系,加上插件基本上就是一个强悍的ide了 ...

  5. 数据库mysql的常规操作

    1. 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. 简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进 ...

  6. centos 7.2 安装apache,mysql,php5.6

    安装Apache.PHP.Mysql.连接Mysql数据库的包: yum -y install httpd yum -y install php yum -y install php-fpm yum  ...

  7. KETTLE并行

    1.转换的并行 转换的并行是改变复制的数量 上面的转换相当于下面的: 实际是把一个任务拆成三部分执行,相当于在一个数据库连接中做了三次查询,数据库连接的开销没有增加,但是有三个进程一起执行. 2.jo ...

  8. 20181120-8 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 06

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2414 版本控制地址    [https://git.coding.net ...

  9. Navicat for mysql导入.sql数据库大小受限制

    把导入单个表的最大限制调一下就行(在my.ini里面就算改了max_allowed_packet也不一定行,因为Navicat貌似并不调用,实际他有自己的一套默认配置,所以需要在Navicat上调整) ...

  10. java沙盒入门(2)

    Java在Internet上的应用已经日渐普遍,使用在网页上的Java程序称之为applet,利用Applet的嵌入能够使原本静态的HTML富有变化,并且能够做到"声"." ...