有 n n n 座塔标号为 1−n" role="presentation" style="position: relative;">1−n1−n1-n,每个塔有两种属性 r,a r , a r,a,现在你要从这些塔中选取若干个塔,使得:对于任意两座塔 i,j (i<j) i , j ( i < j ) i,j\ (i ,需满足 i+ri≤j i + r i ≤ j i+r_i \le j。
求在所有满足上述条件的塔的选择集合 S S S 中,求 max{∑i∈Sairi}" role="presentation" style="position: relative;">max{∑i∈Sairi}max{∑i∈Sairi}max\{\sum_{i \in S}a_ir_i\}。
数据范围: 1≤ri≤n≤106,ai≤109 1 ≤ r i ≤ n ≤ 10 6 , a i ≤ 10 9 1 \le r_i \le n \le 10^6,a_i \le 10^9。

考场上打挂了炸成10分。。
这题一看就是序列dp,不过要用数据结构优化。
题目给定的塔是按顺序的,所以对于一个塔是否能选,
我们只要考虑前面的塔攻击不到这个塔,以及这个塔攻击不到前面的塔就ok。
记 fi f i f_i 为只考虑前 i i i 座塔,选入 i" role="presentation" style="position: relative;">iii 这座塔的最优答案。
那么 fi f i f_i 就等于 [1,i−ri] [ 1 , i − r i ] [1,i-r_i] 范围内无法攻击到 i i i 塔中所有塔 f" role="presentation" style="position: relative;">fff 的最大值,再加 airi a i r i a_ir_i。
然后我们用数据结构维护个前缀最大值,为了保证前面的塔打不到当前的塔,
只插入打不到它的。由于已经按位置排了序,所以前面打不到它的肯定打不到它后面的塔。所以插入后就可以一直放在那里了。复杂度 O(n log n) O ( n l o g n ) O(n\ log\ n)。
代码:

#include <cstdio>
#include <algorithm>
#include <cstring>using namespace std;#define R register
#define Maxn 2000005
#define LL long longstruct tower
{LL atk,r;
}t[Maxn];
int n;
LL f[Maxn],ans;inline int lowbit(R int x){return x&-x;}
struct BIT
{LL tree[Maxn];LL query(R int pos1){R LL ret=0ll;for (;pos1;pos1-=lowbit(pos1)) ret=max(ret,tree[pos1]);return ret; }void insert(R int pos1,R LL val){for (;pos1<=n;pos1+=lowbit(pos1)) tree[pos1]=max(tree[pos1],val);}
}A;int first[Maxn],next[Maxn],to[Maxn],cnt;
void link(R int x,R int y)
{next[++cnt] = first[x]; first[x] = cnt; to[cnt] = y;
}int main()
{
//  freopen("td5.in","r",stdin);scanf("%d",&n);for (R int i=1;i<=n;++i) scanf("%lld",&t[i].r);for (R int i=1;i<=n;++i) scanf("%lld",&t[i].atk);for (R int i=1;i<=n;++i){for (R int j=first[i];j;j=next[j]) A.insert(to[j],f[to[j]]);f[i]=max(f[i],A.query(max(i-t[i].r,0ll)))+t[i].atk*t[i].r;link(i+t[i].r,i);ans=max(ans,f[i]);}printf("%lld\n",ans);return 0;
}

【NOIP训练】塔防游戏 序列DP / 数据结构相关推荐

  1. 区块链塔防游戏NFT游戏开发

    什么是塔防游戏?想必大家都听过对战游戏,打怪游戏,那我给大家说一下塔防游戏吧! 塔防游戏主要代表一类通过在游戏地图上建防御设施或者装置炮塔,阻止敌人进攻的策略型游戏. 在塔防游戏中,玩家需要利用有限的 ...

  2. (译)如何做一个塔防游戏(cocos2d 2012-8-17)

    PS:一直关注http://www.raywenderlich.com/这个网站,前几天看了他们8月17发的一个塔防游戏教程,试了一下感觉不错,搜了一下没发现没有译成中文的(不知道现在有没有),就自己 ...

  3. 使用Unity创建塔防游戏(Part1)

    How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...

  4. 如何在unity中制作塔防游戏

       塔防游戏非常流行,毫无疑问--没有什么比看着自己的防御消灭讨厌的侵略者更让人满足!在这两部分教程中,用unity来制作一个塔防游戏! 将会学习怎样...... 创建一波敌人 让它们跟随线路点 ...

  5. (译)如何使用cocos2d制作一个塔防游戏:引子

    原文链接地址:http://www.iphonegametutorials.com/2011/04/11/cocos2d-game-tutorial-how-to-build-a-tower-defe ...

  6. 塔防游戏的路径寻找算法分析

    在塔防游戏中,有很多敌人都是向着同一目标前进的.在众多塔防游戏当中,有一条或几条预定好的路径.在一些塔防游戏中,比如经典的<Desktop Tower Defense>,你可以将塔放在地图 ...

  7. 用Unity开发一款塔防游戏(一):攻击方设计

    大家好.偶尔想起了这个手把手教学的.但现已长满杂草的坑,还是来挖几铲子. 这一期的游戏是最常见的类型之一--塔防. 塔防游戏相信大家并不陌生,几个主要元素如下: 1.敌方士兵 2.我方防御塔 3.我方 ...

  8. cocos2d-x游戏实例(10)-塔防游戏(修改地图图素,地图整体缩放)

    小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 塔防游戏在目前的智能机游戏中占据很重要的部分, ...

  9. unity塔防游戏怪物转向_Unity官方新手游戏项目推荐合集

    Unity官方新手游戏项目推荐合集 今天给同学们介绍一些Unity官方发布过的一些游戏项目,这些项目都简化了游戏开发的入门学习过程,可以快速地制作出游戏,适合新手入门体验,下面就带同学们看一看: Un ...

最新文章

  1. LeetCode刷题-1
  2. windows主机防护
  3. oracle connection 有时能取到有时候又取不到
  4. SQLAlchemy 一些基本操作
  5. MySQL主从复制(二)
  6. 【编程好习惯】复用代码以提高可维护性
  7. 逆置单链表c语言程序,逆置单链表C语言
  8. vc6.0到vc 2008(vc 9.0)的变化
  9. Spring MVC拦截器配置以及统一登陆校验实现
  10. 如何升级linux内核
  11. xp怎么删除计算机用户,xp如何删除多余的用户帐户_IT /计算机_信息
  12. 计算机二级需要报班,计算机二级需要报班培训吗
  13. 由自身经历谈“不谋全局者,不足以谋一域”
  14. 超好用的windows远程桌面管理工具Remote Desktop Connection Manager
  15. Chrome浏览器绿色、免安装版下载,长期更新
  16. 第十届颗携枪通过固定障碍
  17. PNAS:高等数学大脑网络
  18. IoT物联网——各大厂质量保障实践分享汇总(智能语音视频篇)
  19. Openlayers中的比例尺(scale)和分辨率(resolution)
  20. 调用baidu aip

热门文章

  1. linux内核源码实战_3.2理解设备驱动和文件系统
  2. 如何解决VS启动越来越慢
  3. QQ第三方登录认证流程
  4. 怎么剪gif图的尺寸?
  5. 历代魅族旗舰手机主要参数对比,更新于2021年5月
  6. 创意论——游戏创意的元素
  7. 2012年的最后一个工作日
  8. 关于即来即停app的功能
  9. 8小时8分:2018年天猫双11交易额破1207亿元 已超2016年全天
  10. 有10箱产品,每箱有1000件,其中正品每件100克。其中有几箱是次品,每件次品比正品轻10克,问能否用秤只称一次,就找出哪几箱是次品?