东方幻想乡系列模拟赛T2琪露诺题解
题目地址:
http://fzoj.xndxfz.com/JudgeOnline/problem.php?id=2146&csrf=17peCLMJM49glhqlg9KaD7Agf5o5QY87
题目描述:
在幻想乡,琪露诺是以笨蛋闻名的冰之妖精。某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来。但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸。于是琪露诺决定到河岸去追青蛙。小河可以看作一列格子依次编号为0到N,琪露诺只能从编号小的格子移动到编号大的格子。而且琪露诺按照一种特殊的方式进行移动,当她在格子i时,她只会移动到i+L到i+R中的一格。你问为什么她这么移动,这还不简单,因为她是笨蛋啊。每一个格子都有一个冰冻指数A[i],编号为0的格子冰冻指数为0。当琪露诺停留在那一格时就可以得到那一格的冰冻指数A[i]。琪露诺希望能够在到达对岸时,获取最大的冰冻指数,这样她才能狠狠地教训那只青蛙。但是由于她实在是太笨了,所以她决定拜托你帮它决定怎样前进。开始时,琪露诺在编号0的格子上,只要她下一步的位置编号大于N就算到达对岸。
输入格式:
第 1 行: 3 个正整数 N, L, R
第 2 行: N+1 个整数,第 i 个数表示编号为 i-1 的格子的冰冻指数 A[i-1]
输出格式:
第 1 行:一个整数,表示最大冰冻指数。保证不超过 2^31-1
第 2 行:空格分开的若干个整数,表示琪露诺前进的路线,最后输出-1 表示到达对岸
输入样例:
5 2 3
0 12 3 11 7 -2
输出样例:
11
0 3 -1
数据范围:
对于 60%的数据: N <= 10,000
对于 100%的数据: N <= 200,000
对于所有数据 -1,000 <= A[i] <= 1,000 且 1 <= L <= R <= N
题解:
题目大意我就不多说了,看到这道题可以想到DP,状态转移方程式也不难想出:
f[j]=max(f[k]+a[j],f[j])(j-r<=k<=j-l)
因为需要求一个区间中最大的点,如果选择N的时间扫一遍肯定会爆,所以我们需要使用线段树来维护一个区间中的最大节点的值。大概就这样,有一点需要注意的是数组的范围至少要比N的最大值大6000,不然最后一组数据会爆。下面贴代码吧。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
using namespace std;
const int N=200005;
int tree[N<<2],n,l,r,f[N<<1],a[N<<1];
void pushup(int rt)
{tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
}
void build(int k,int num,int l,int r,int rt)
{if(l==r&&l==k){tree[rt]=num;return ;}int mid=(l+r)>>1;if(k<=mid) build(k,num,ls);else build(k,num,rs);pushup(rt);
}
void Init()
{memset(f,0,sizeof(f));memset(tree,0xaf,sizeof(tree));memset(a,0,sizeof(a));scanf("%d%d%d",&n,&l,&r);for(int i=0;i<=n;i++){scanf("%d",&a[i]);}
}
int query(int le,int ri,int l,int r,int rt)
{if(le<=l&&ri>=r){return tree[rt];}int mid=(l+r)>>1;if(ri<=mid){return query(le,ri,ls);}if(le>mid){return query(le,ri,rs);}if(le<=mid&&ri>mid){return max(query(le,mid,ls),query(mid+1,ri,rs));}
}
void dfs(int k)
{if(k==0){printf("0 ");return ;}for(int i=max(k-r,0);i<=k-l;i++){if(f[i]+a[k]==f[k]){int t1=a[i],t2=f[i];dfs(i);break;}}if(k>=n){printf("-1");return ;}printf("%d ",k);return ;
}
void work()
{f[0]=a[0];build(0,f[0],0,n+r,1);for(int i=l;i<=n+r;i++){f[i]=query(max(0,i-r),i-l,0,n+r,1)+a[i];build(i,f[i],0,n+r,1);}int maxn=0,ord;for(int i=n;i<=n+r;i++){if(f[i]>maxn){maxn=f[i];ord=i;}}printf("%d\n",maxn);dfs(ord);
}
int main()
{Init();work();return 0;
}
东方幻想乡系列模拟赛T2琪露诺题解相关推荐
- 【东方幻想乡系列模拟赛 Stage 4】 河城荷取
Description 在幻想乡,河城荷取是擅长高科技工业的河童.荷取的得意之作除了光学迷彩外,还有震动整个幻想乡的巨型人形『非想天则』.不过由于人形太过巨大,所以为它充能是一件很麻烦的事.人形一共有 ...
- codevs1376帕秋莉•诺蕾姬 东方幻想乡系列模拟赛Stage 2[三星]
题目很老但是很经典~ 题目链接:-------------->题目地址 题目描述 Description 在幻想乡,帕秋莉•诺蕾姬是以宅在图书馆闻名的魔法使.这一天帕秋莉又在考虑如何加强魔法咒语 ...
- [wikioi 1418]铃仙•优昙华院稻叶(东方幻想乡系列模拟赛)(树上递推)
题目:http://www.wikioi.com/problem/1418/ 分析: 一看就肯定是树上的递推 设f[i][j][k]表示第i秒在k点(从j点走过来的)的概率 则f[i][j][k]=f ...
- 东方幻想乡/BadApple!!
原曲:东方幻想乡/BadApple!! Vocal:nomico サークル:Alstroemeria Records 社团:Alstroemeria Records アルバム:Lovelight 专辑 ...
- 【洛谷】【动态规划+单调队列】P1725 琪露诺
[题目描述:] 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到河 ...
- 洛谷P1725琪露诺【单调队列+dp】
题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到河岸去追 ...
- UESTC 1808 琪露诺的算术教室 打表+特判(找规律)
题目 琪露诺是个聪明的精灵,她非常擅长和数字有关的游戏 . 直到有一天灵梦进入了迷雾深林,她遇见了琪露诺,并向她提出了一个问题. 统计n个一位数字a组成的数乘以一位数b的结果中有多少个一位数字d.不超 ...
- mc幻想乡java_我的世界1.7.2幻想乡整合版下载_我的世界1.7.2东方幻想乡下载_游戏之家...
游戏类型:休闲益智(50.0) 游戏语言:简体中文 游戏大小:241MB 制 作 商:暂无 发 行 商:暂无 上市时间:2016-03-25 游戏标签:轻松 适用系统:WinXP, Vista, Wi ...
- 第十四届蓝桥杯校内模拟赛第二期-Java个人题解(仅供参考)
刚刚结束第十四届蓝桥杯校内模拟赛第二期,在这记录下自己的代码 不保证正确! 不保证正确! 不保证正确! 有问题一起改正!! 题解 2048 代码: package _14届模拟2;public cla ...
最新文章
- 微软小冰从上海音乐学院音工系毕业,师从于阳、陈世哲
- 1、Power View—使用前的准备
- Ajax.NET 作者发布支持Visual Web Developer 2005的模板安装
- ios整理(一)控件
- C语言字符篇(五)内存函数
- jq之animate() left font
- 商汤科技62篇论文入选CVPR 2019!多个竞赛项目夺冠!
- java系列4:数组的默认值
- mysql去掉重复数据只保留一条,以及取分组后的一条数据
- python入门指南txt-pip安装和使用入门指南
- 中标麒麟NeoKylin系统使用--使用UFEI安装中标麒麟系统过程中/dev/disk/by-label/NeoKylin does not exit问题的解决
- 《惊人的假说-灵魂的科学探索》读书笔记(1)
- 黑苹果音频卡顿_DXOMARK 公布无线音箱音质基准:苹果华为 Sonos 上榜
- 使用d2rq把mysql转化为rdf_D2RQ数据导出
- 网站ssl证书出现错误如何解决
- 显卡无法为此计算机,如何解决win10系统电脑中无法安装intel显卡驱动的问题
- 张成分析(spanning test):portfolio_analysis.Spanning_test
- c语言20s计数器,计数器延时程序与级联程序的plc梯形图实现
- 怎么把字母缩小当符号_iPhone自带输入法怎么用 iPhone自带输入法小技巧【详解】...
- 优秀课程案例:使用Scratch的画笔积木模块绘制模拟内摆线!
热门文章
- 七夕到了——属于程序员的浪漫
- ls200_红宝石-铁三角LS200is 入耳耳机测评 音质篇
- 怎么让textarea占满整个td高度没用_功能沙发怎么挑,也许你可以看看我这篇。...
- C/C++项目分享——鸣人释放技能螺旋丸
- mysql longblob 读取_MySQL数据库之Mysql的longblob字段插入数据问题解决
- 【Source教程】Crowbar下载部署与使用方法
- 组合逻辑毛刺消除(竞争冒险)
- 什么品牌的蓝牙耳机音质好?盘点四款佩戴舒适的蓝牙耳机
- c语言中strtod()函数的用法
- Futter组件整理汇总