CF1651F Tower Defense

2023-10-17 04:04
文章标签 defense cf1651f tower

本文主要是介绍CF1651F Tower Defense,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CF1651F Tower Defense

洛谷CF1651F Tower Defense

题目大意

n n n座防御塔按 1 1 1 n n n的顺序排成一列,每座防御塔都有一个能量上限 c i c_i ci和能量回复速率 r i r_i ri。对于一座塔 i i i,每过一秒,它的能量 w i w_i wi就会变成 min ⁡ ( w i + r i , c i ) \min(w_i+r_i,c_i) min(wi+ri,ci),每座塔在初始时满能量。

q q q个怪物,每个怪物都有两个属性 t i t_i ti h i h_i hi,表示这个怪物会在第 t i t_i ti秒出现在第一座塔前。当它到第 j j j座塔前时,自己的血量 h i h_i hi会减少 min ⁡ ( h i , w j ) \min(h_i,w_j) min(hi,wj),塔的能量也会减少这个数。当怪物的血量 h i = 0 h_i=0 hi=0时怪物停止移动,否则它下一秒会移动到下一座塔。

有些怪物在经过塔 n n n后血量仍未减少至 0 0 0,求这样的怪物最终剩下的血量的总和。

注意每座塔是先恢复能量再打怪物。

  • 1 ≤ n , q ≤ 2 × 1 0 5 1\leq n,q\leq 2\times 10^5 1n,q2×105
  • 1 ≤ c i , r i ≤ 1 0 9 1\leq c_i,r_i\leq 10^9 1ci,ri109
  • 1 ≤ h i ≤ 1 0 12 1\leq h_i\leq 10^{12} 1hi1012
  • 0 ≤ t i ≤ 2 × 1 0 5 0\leq t_i\leq 2\times 10^5 0ti2×105
  • ∀ 1 ≤ j < q , t j < t j + 1 \forall 1\leq j<q,t_j<t_{j+1} ∀1j<q,tj<tj+1

题解

考虑对塔进行分块,当一个怪进入一个块内的塔时,只有两种情况:

  • 块内所有塔把怪打了一遍之后怪还有血,这时可以看作块中所有塔内的能量都被清零了
  • 怪被块中的一座塔打到血量为 0 0 0,此时这个怪不会再对后面的块产生贡献

我们发现,因为一个怪最多会被打空血一次,所以第二种情况只会出现 O ( q ) O(q) O(q)次。

对于每个块,维护一个推平标记 f l fl fl表示这个块是否被推平,以及 l s t lst lst表示这个块上次被操作的时间戳。预处理出每个块被清零后 t t t秒这个块的能量总和 p r t pr_t prt,对于每个怪依次处理每个块:

  • 如果这个块没被推平或怪能被块中的一座塔打空血,则暴力遍历一遍这个块,并判断这个怪是否能推平这个块
  • 否则,直接把这个怪的血量减去预处理出的值,推平标记不变

我们发现,一开始有 n n n个块没被推平,后面每个怪都会使得有最多一个块从被推平状态变为没被推平状态,也就是说第一种情况只会出现 O ( n + q ) O(n+q) O(n+q)次。每次 O ( n ) O(\sqrt n) O(n )暴力修改,均摊下来的时间复杂度为 O ( ( n + q ) n ) O((n+q)\sqrt n) O((n+q)n )

每个怪最多遍历 n \sqrt n n 个块,所以第二种情况的时间复杂度为 O ( q n ) O(q\sqrt n) O(qn )

下面考虑如何对每个块求 p r t pr_t prt。因为 1 ≤ t i ≤ 2 × 1 0 5 1\leq t_i\leq 2\times 10^5 1ti2×105,所以我们只需要求 1 ≤ t ≤ 2 × 1 0 5 1\leq t\leq 2\times 10^5 1t2×105 p r t pr_t prt即可。

设当前块在第 0 0 0时刻清零,当前时刻为 t t t,则对于块中的每一座塔 i i i,分为三种情况:

  • 1 ≤ t ≤ ⌊ c i r i ⌋ 1\leq t\leq \lfloor\dfrac{c_i}{r_i}\rfloor 1trici,则从 t − 1 t-1 t1 t t t这一单位时间,塔 i i i贡献了 r i r_i ri的能量
  • t = ⌊ c i r i ⌋ + 1 t=\lfloor\dfrac{c_i}{r_i}\rfloor+1 t=rici+1,则从 t − 1 t-1 t1 t t t这一单位时间,塔 i i i贡献了 c i m o d r i c_i\bmod r_i cimodri的能量
  • t ≥ ⌊ c i r i ⌋ + 2 t\geq \lfloor\dfrac{c_i}{r_i}\rfloor+2 trici+2,则从 t − 1 t-1 t1 t t t这一单位时间,塔 i i i没有贡献能量

我们考虑维护每一秒的能量增量的差分,做一次前缀和就能得到每一秒的能量增量,再做一次前缀和即可得到 p r t pr_t prt

这样每求一块的 p r t pr_t prt O ( n ) O(n) O(n)的,总共有 n \sqrt n n 块,所以预处理的时间复杂度为 O ( n n ) O(n\sqrt n) O(nn )

虽然时间复杂度是 O ( ( n + q ) n ) O((n+q)\sqrt n) O((n+q)n )的,但这题的空间复杂度是 O ( n n ) O(n\sqrt n) O(nn )的,数组开不下。我们考虑如何降低空间复杂度。

我们可以先把询问离线下来,然后一块一块地做,每块都将每个怪处理一次,这样就只需保留当前块的 p r t pr_t prt和推平标记,空间复杂度就降为 O ( n ) O(n) O(n)了。

总时间复杂度为 O ( ( n + q ) n ) O((n+q)\sqrt n) O((n+q)n ),空间复杂度为 O ( n ) O(n) O(n)

code

#include<bits/stdc++.h>
using namespace std;
const int N=200000;
int n,q,bl;
long long ans=0,C[N+5],R[N+5],t[N+5],h[N+5],w[N+5],pr[N+5],v[N+5];
int pos(int i){return (i-1)/bl+1;
}
void init(int l,int r){long long wt=0;for(int i=0;i<=N;i++) v[i]=0;for(int i=l;i<=r;i++){wt+=R[i];if(C[i]/R[i]>=N) continue;v[C[i]/R[i]+1]+=C[i]%R[i]-R[i];v[C[i]/R[i]+2]+=-C[i]%R[i];}for(int i=1;i<=N;i++){wt+=v[i];pr[i]=pr[i-1]+wt;}
}
void solve(int l,int r){init(l,r);int fl=0,lst=0;for(int i=1;i<=q;i++){if(!h[i]) continue;if(!fl||fl&&h[i]<=pr[t[i]-t[lst]]){fl=1;for(int j=l;j<=r;j++){w[j]=min(C[j],w[j]+(t[i]-t[lst])*R[j]);if(h[i]>=w[j]){h[i]-=w[j];w[j]=0;}else{w[j]-=h[i];h[i]=0;fl=0;}}}else h[i]-=pr[t[i]-t[lst]];lst=i;}
}
int main()
{
//	freopen("dinosaurs.in","r",stdin);
//	freopen("dinosaurs.out","w",stdout);scanf("%d",&n);bl=sqrt(n);for(int i=1;i<=n;i++){scanf("%lld%lld",&C[i],&R[i]);w[i]=C[i];}scanf("%d",&q);for(int i=1;i<=q;i++){scanf("%lld%lld",&t[i],&h[i]);}for(int i=1;i<=pos(n);i++){solve(i*bl-bl+1,min(i*bl,n));}for(int i=1;i<=q;i++) ans+=h[i];printf("%lld",ans);return 0;
}

这篇关于CF1651F Tower Defense的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/222814

相关文章

437 - The Tower of Babylon(动态规划)

这题感觉比较水了,只不过建立模型的时候需要想一下,给n个长方体,我们不妨给它长宽高固定的3个长方体。 之后根据长宽的大小排序。 dp[i]代表第i个长方体当顶面的时候的高度,所以初始的时候dp[i] = cub[i[.h, dp[i] = dp[j] + cub[i[.h(当j的长宽均严格小于i的时候成立) 13989891 437 The Tower of Babylon Acce

论文《Adversarial Examples on Graph Data: Deep Insights into Attack and Defense》笔记

【IG-Attack 2019 IJCAI】本文提出了一种基于integrated gradients的对抗攻击和防御算法。对于攻击,本文证明了通过引入integrated gradients可以很容易解决离散问题,integrated gradients可以准确反映扰动某些特征或边的影响,同时仍然受益于并行计算。对于防御,本文观察到目标攻击的被攻击图在统计上不同于正常图。在此基础上,本文提出了一

Tower for Mac Git客户端管理软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试1、打开软件,测试2、克隆项目,测试 安装完成!!! 效果 一、下载软件 下载软件 链接:www.macfxb.cn 二、开始安装 1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕

[HDU 5886] Tower Defence (树形DP)

HDU - 5886 给定一棵树,每条边都有一个权值 定义一条边的战术价值为割去这条边后 剩下的图中最长链的长度 求随机割掉一条边,战术价值的期望 题目要求乘以 N−1 N-1,所以直接把概率消掉了 所以只要求割去每条边后的最长链长度即可 这就转化为了一个树形dp 首先割去一条边 u−>v u->v 后,最长链可能在 v v 为根的子树中 这个简单地做一次树形dp

Ansible-Tower快速入门-1.概览【翻译】

概览 Tower Ansible-Tower是作为Ansible的一个web接口界面,并采用REST API作为端点接入。通过使用开源的orchestration engine,无论是与你的团队共享操作任务,或是通过REST API与你的Ansible集成,Tower都提供了许多强大的自动化工具来让你的生活更轻松。 实时的playbooks输出和浏览 可以实时的查看playbooks的

Codeforces 392B Tower of Hanoi(递归+记忆化搜索)

题目链接:Codeforces 392B Tower of Hanoi 题目大意:给出一个3*3的矩阵,表示从i移动到j的代价,现在给出n,表示有n个碟子在1柱,需要移动到3柱,要求给出最小的花费。 解题思路:dp[l][r][n],表示的是从l移动n个碟子到r的最小花费,然后总共有两种移动方式: ans1 = solve(l, x, n-1) + solve(x, r, n-1

HDU 4939 Stupid Tower Defense

题目链接~~> 做题感悟:开始看着题很明显的 dp 但是dp 到最后也没 dp 出来,做完这题之后发现其实有些 dp 需要一些贪心的思想,然后再dp一下。 解题思路:                    三种塔都有各自的功能,就和英雄杀里的人物技能一样,绿塔和蓝塔貌似为红塔做铺垫,绿塔负责增加伤害,蓝塔负责增加时间,和英雄杀里宋江,西施,商鞅三个人的配合差不多,只有相互配合才使得伤害最大化

Codeforces Round #230 (Div. 2) C. Blocked Points D. Tower of Hanoi

C. Blocked Points 题意:A点和B点是4-connected,的条件是 the Euclidean distance between A and B is one unit and neither A nor B is blocked; or there is some integral point C, such that A is 4-connected with C,

Tower在深度学习中的概念,tower没有确切定义

在论文UniTS中,来自Havard的工作。 tower更像是针对一个task的组件 tower这个概念貌似在REC(recommendation)推荐系统中使用较多 deep learning - What is a tower? - Data Science Stack Exchange  https://developers.google.com/machine-lea

Tower for Mac:Git管理的新境界

Tower for Mac,让您的Git管理进入新境界!这款专为Mac用户打造的Git客户端,凭借其出色的性能和丰富的功能,成为众多开发者的首选工具。 Tower不仅支持常规的Git操作,如提交、推送和拉取,还提供了许多高级功能,如分支比较、合并冲突解决等,让您能够更深入地管理代码版本。同时,它还支持多种团队协作方式,让您能够与团队成员无缝协作,共同推进项目进度。 在使用体验上,Tower fo