首页 > 其他分享 >炸弹

炸弹

时间:2024-03-07 22:11:06浏览次数:13  
标签:边界 int site 波及 炸弹 fan

题目描述

image

样例

4
1 1
5 1
6 5
15 15
32

分析

虽然这题正解是tarjan,但我决定不用tarjan(实际上是我没想出来),很容易想到,对于每一个炸弹,我们看它是否能波及到下一

个炸弹,然后从下一个炸弹找它能波及到的炸弹,想一想实际上不是很复杂,用线性递推可以搞,每一个炸弹对每一个炸弹的贡

献只有能炸或不能炸,所以只需要用记忆化处理一下最左能波及到的和最右能波及到的位置就可以了,因为有记忆化,每一个炸

弹最多被遍历一遍,其他炸弹再遍历到相同炸弹时用之前处理的就行了,由此复杂度O(n),十分优秀。

下面就是怎么实现了,对于左边界,每次去更新到新的炸弹的距离是否满足,满足就更新一下最左边界,因为由前向后遍历,之

前炸弹能炸到的炸弹越往后是逐渐累积的,这里需要更新一下能波及的最大右边界,因为有可能左边炸弹范围更大,所以要提前

处理,右边界方法相同,处理右边界时要多处理一次左边界,因为上面处理左边界是是从左向右的,有可能右面范围更大,思路

毕。。。

solution

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=500010,mod=1e9+7;
int n,l[maxn],r[maxn],ans;
struct node{int site,fan;}m[maxn];
signed main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld",&m[i].site,&m[i].fan);
		l[i]=r[i]=i;//预处理左右边界 
	}
	for(int i=1;i<=n;i++)//找左边界 
	{
		while(m[i].site-m[l[i]-1].site<=m[i].fan&&l[i]>1)//下一个未判定的炸弹可以被现在的最大波及范围攻击到 
		{
			m[i].fan=max(m[i].fan,m[l[i]-1].fan-(m[i].site-m[l[i]-1].site));
			/*
			更新可以波及到的右边界 
			这里不用将范围更新成m[l[i]-1].fan,因为如果它减去区间还比m[i].fan大,那么在
			之前它一定会更新它的最左边界,所以这里只要更新右边界即可
			*/ 
			l[i]=l[l[i]-1];//左边界变成这个炸弹能波及到的左边界 
		}
	}
	for(int i=n;i>=1;i--)
	{
		while(m[r[i]+1].site-m[i].site<=m[i].fan&&r[i]<n)//原理同上,上面已经更新过最大右边界范围了 
		{
//			cout<<"!";
			l[i]=min(l[i],l[r[i]+1]);//同上,更新的是下一个炸弹,不是下一个炸弹波及到的右边界 
			r[i]=r[r[i]+1];
		}
	}
	for(int i=1;i<=n;i++)
	{
		ans+=(r[i]-l[i]+1)*i;//l[i],r[i]都是闭区间,要加一 
	}
	printf("%lld\n",ans%mod);
	
	return 0;
}

标签:边界,int,site,波及,炸弹,fan
From: https://www.cnblogs.com/oceansofstars/p/18059900

相关文章

  • 激光炸弹
    题目描述一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标。现在地图上有n(n≤10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为R的正方形的边必须和x,......
  • 炸弹人
    ```cpp#include<bits/stdc++.h>#include<windows.h>#include<stdio.h>#include<conio.h>#include<time.h>#defineKEY_DOWN(VK_NONAME)((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)usingnamespacestd;intm[10001][21];structnode......
  • # 实验三 **数字炸弹游戏**
    实验三数字炸弹游戏一、实验目的1.了解和掌握数字炸弹游戏的原理2.熟练运用python的基本语句与关系运算符二、实验内容数字炸弹游戏流程:1、电脑随机生成炸弹数字2、打印炸弹数字范围3、自己猜一次784、缩小炸弹范围,并打印出来。1-786、循环3、4操作,直到炸弹爆炸,游戏结......
  • 著名的fork炸弹
    今天突发奇想,想试验下著名的fork炸弹是否真的可以将服务器资源耗尽崩溃,索性拿我个人服务器尝试下吧。先上代码:#!/usr/bin/envpython#encoding:utf-8"""@author:jc@contact:Hurrican@software:PyCharm@file:fork炸弹--只能运行在Linux上@create:2023/7/2010:26......
  • csapp二进制炸弹实验个人总结
    2023/7/13完成了这个实验,算是我的第一次逆向实战,对我来说很有挑战性。总结如下:1.对于汇编的熟练度,尤其是“层次”问题,mov0x8(%rsp),%rax和lea0x8(%rsp),%rax并不同;要注意某一个值本身是“地址”还是“数值”2.理解机器码工作原理后,拓宽思路,经验+寻找新的方法3.看待问题的视角......
  • P5025 SNOI2017 炸弹
    P5025SNOI2017炸弹不难看出本题是可以转化为图论模型的:建立\(n\)个点代表\(n\)个炸弹,如果第\(i\)个炸弹能直接引爆第\(j\)个炸弹,就连边\(i\toj\)。这样的图论模型很好地刻画了原题中引爆的传递性,题意中第\(i\)个炸弹能直接/间接引爆第\(j\)个炸弹直接等价于......
  • 由碳化硅,氧化锌,三硝基甲苯, 季戊四醇四硝酸酯, 三过氧化三丙酮, 环三亚甲基三硝基胺合
    由碳化硅,氧化锌,三硝基甲苯,季戊四醇四硝酸酯,三过氧化三丙酮,环三亚甲基三硝基胺合成的电压激发炸弹当直径是20mm高度是20mm圆柱体碳化硅压敏电阻器在加上10KV高压时,它的晶体就会发生爆裂,直径是20mm高度是20mm圆柱体氧化锌压敏电阻器在加上10KV高压时,它的晶体也会发生爆裂。这......
  • 用 Pulsar 开发多人小游戏(一):炸弹人游戏开发需求及难点
    我之前写过一篇文章我用消息队列做了个联机游戏用Pulsar这款消息队列实现了一个比较简陋的炸弹人游戏,结果不少读者对这个小游戏都很感兴趣,甚至在Pulsar的技术交流群......
  • 甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩
    作者:子白AHPA介绍背景Kubernetes中应用实例数设置有固定实例数、HPA和CronHPA三种策略。使用最多的是固定实例数,但是很多业务都存在波峰浪谷,如果采用固定实例数的......
  • 激光炸弹【算法竞赛进阶指南, HNOI2003】
    激光炸弹地图上有\(N\)个目标,用整数\(Xi,Yi\)表示目标在地图上的位置,每个目标都有一个价值\(Wi\)。注意:不同目标可能在同一位置。现在有一种新型的激光炸弹,可以摧毁......