SDUT3298 小鑫杀怪兽 滚动数组 防TLE

小鑫杀怪兽

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

塔防游戏 是一类很出名的游戏,在游戏里,你需要建造一些防御塔来攻击怪兽从而保卫小鑫国王。现在又有一波怪兽来袭了,你需要知道小鑫国王能否顶住怪兽的攻击。

怪兽所走的路是一条直线,这条直线上有N个格子(连续编号从1到N)。在怪兽敌人赶来之前,你需要建造M个防御塔。每个防御塔的攻击范围是[L, R],意味着这个防御塔可以攻击从L到R之间所有的敌人。当某个怪兽待在第i个位置时,每一个能攻击到第i个位置的防御塔都会对这个怪兽进行一次攻击,怪兽在进行下一次移动之前不会再受到同一个防御塔的攻击。举个例子,一个防御塔的攻击范围是[1, 3],一个怪兽会在第1个格子、第2个格子、第3个格子分别受到1次攻击。

一个邪恶的女巫会帮助所有的怪物安置初始位置(第i个怪兽出现在格子Xi)。所有的怪兽都沿直线行动(沿着从1到N的方向)。

现在你知道每个怪兽的血量Hi 以及每个防御塔的伤害值Di ,(一次攻击会对怪兽造成Di点伤害,怪兽的血量会下降Di)。如果一个怪兽的血量Hi降低到0或者0以下,这个怪兽就会被打死然后消失。

你的任务是计算最经过所有的防御塔攻击,会留下多少的怪兽。

输入

输入包含多组。

每组的第一行是一个整数N (0 < N <= 100000),代表路上一共有N个格子。第二行是一个整数M (0 < M <= 100000),代表小鑫拥有的防御塔的数量。接下来M行,每行包含三个整数Li, Ri, Di (1 <= Li <= Ri <= N, 0 < Di <= 1000),代表防御塔的攻击范围[L, R]以及防御塔的伤害值。接下来一个整数K (0 < K <= 100000),代表怪兽的数量。接下来K行,每行有两个整数Hi 和 Xi (0 < Hi <= 10^18, 1 <= Xi <= N),代表怪兽的血量以及怪兽的起始位置。

当N = 0时输入结束。

输出

输入一个整数,代表最后存活的怪兽的数量。

示例输入

5
2
1 3 1
5 5 2
5
1 3
3 1
5 2
7 3
9 1
0

示例输出

3

提示

提示:

在样例中,初始血量为5、7和9的三个怪兽最后还存活着。

来源

GLSilence

示例程序

#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;

long long int a[100010];
long long int hi,xi;
int main()
{
    int n,m,x,y,z,k;
    while(~scanf("%d",&n))
    {
        if(n==0) break;
        scanf("%d",&m);
        memset(a,0,sizeof(a));
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&x,&y,&z);               //代替了每次都从x跑到y赋值<span id="transmark"></span>
            a[x]+=z;
            a[y+1]-=z;
        }

        for(int i=1;i<=n;i++)                   //滚动数组防TLE
        {
            a[i]=a[i-1]+a[i];
        }
        for(int i=n-1;i>=1;i--)
        {
            a[i]+=a[i+1];
        }

        scanf("%d",&k);
        long long int num=0;
        while(k--)
        {
            scanf("%lld%lld",&hi,&xi);
            if(hi>a[xi])
                num++;
        }
        printf("%lld\n",num);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 13:36:02

SDUT3298 小鑫杀怪兽 滚动数组 防TLE的相关文章

HTML5 键盘监听原理实现的抓怪兽游戏+代码

HTML5小游戏抓怪兽,应用Canvas等超多的HTML5技巧编写而成,下面来向大家汇报实现步骤: 1.创建游戏画布: .代码   var canvas = document.createElement("canvas"); var ctx = canvas.getContext("2d"); canvas.width = 512; canvas.height = 480; document.body.appendChild(canvas); 我们需要做的第一件事是

HDU 1024 Max Sum Plus Plus --- dp+滚动数组

HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值,其中第i个子序列包括a[j], 则max(dp[m][k]),m<=k<=n 即为所求的结果 <2>初始状态: dp[i][0] = 0, dp[0][j] = 0; <3>状态转移: 决策:a[j]自己成为一个子段,还是接在前面一个子段的后面 方程: a[j]直接接在前面

动态规划算法之滚动数组的求解(C++)

虽然接触动态规划算法已经有一段时间,给一个01背包问题,能够做到一个表格简单粗暴下去,然后求得结果,但心里总觉得对这个算法理解十分不到位,抱着对算法的热爱,网上很多大牛的算法思维实在让我佩服的五体投地.在此讲一讲动态规划中滚动数组的求解方法,算是对这个知识点做一个记录,也希望有写的不妥的地方,大家能不吝赐教. 首先,我们先看看"滚动数组"的例题,大家可以参考http://www.lintcode.com/en/problem/house-robber/ 题意大概就是说:一个盗贼要去偷盗

【BZOJ】1925: [Sdoi2010]地精部落 DP+滚动数组

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1925 题意:输入一个数N(1 <= N <= 4200),问将这些数排列成折线型有多少中合法的排列:折线形即一个数比相邻的数都大或者都小; 如:1 3 2 4就是一个折线型: 思路:f[i,j]表示排列的前i个数是以1...j为开头的第一位下降的合法个数: 转移公式为:f[i][j] = f[i][j-1] + f[i-1][i-j]; f[i][j-1]就不把第j个数添加到首位的原来

滚动数组~\(≧▽≦)/~

今天第一次用了滚动数组,缘由要从一道题说起:POJ 1159 Palindrome 题意:给你一个字符串,求对字符串最少添加几个字符可变为回文串. 分析: 简单做法是直接对它和它的逆序串求最长公共子序列长度len.n-len即为所求.至于为什么,小盆友们可以自己模拟一下下.O(∩_∩)O~因为这不是我们今天讲的重点~噶呜 很明显这是一道LCS题,如果你还不知道什么是LCS,可以点击  LCS  ,我们都知道要开辟一个dp[5001][5001]的数组来存LCS值,问题来了,当我开心的交上代码的时

HDU 5281 Senior&amp;#39;s Gun 杀怪

题意:给出n把枪和m个怪.每把枪有一个攻击力,每一个怪有一个防御力.假设某把枪的攻击力不小于某个怪的防御力则能将怪秒杀,否则无法杀死.一把枪最多仅仅能杀一个怪,不能用多把枪杀同一个怪.每杀一次怪能够得到枪的攻击力减去怪的防御力的的分数. 求得分的最大值. 贪心.首先我们考虑这样一种情况:用攻击力为A的枪杀防御力为a的怪,攻击力为B的枪杀防御力为b的怪.则得分为A - a + B - b. 最好还是设A ≤ B,则有a ≤ A ≤ B.b ≤ B.假设有A < b,那么我们考虑用B杀a.而不使用A

HDU 5281 Senior&#39;s Gun 杀怪

题意:给出n把枪和m个怪.每把枪有一个攻击力,每个怪有一个防御力.如果某把枪的攻击力不小于某个怪的防御力则能将怪秒杀,否则无法杀死.一把枪最多只能杀一个怪,不能用多把枪杀同一个怪.每杀一次怪可以得到枪的攻击力减去怪的防御力的的分数.求得分的最大值. 贪心.首先我们考虑这样一种情况:用攻击力为A的枪杀防御力为a的怪,攻击力为B的枪杀防御力为b的怪.则得分为A - a + B - b. 不妨设A ≤ B,则有a ≤ A ≤ B,b ≤ B.如果有A < b,那么我们考虑用B杀a,而不使用A枪也不杀b

Java练习 SDUT-2737_小鑫の日常系列故事(六)——奇遇记

小鑫の日常系列故事(六)--奇遇记 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 今天,小鑫在山上玩的时候,意外被推下了悬崖. 当然,掉下悬崖之后必然有奇遇.(剧情就是这么坑爹)就狗血的碰到了野人A和野人B.然后两位野人就给了他一本武功秘籍. 这是一本强大的武功秘籍(好像武功秘籍一直都很强大).共有40层的内功心法.当他练到第n层的时候,就可以借助高强的武功离开这个地方.你已经知道的是:练成第一层需要一天,练成第二

P5241 序列(滚动数组+前缀和优化dp)

P5241 序列 挺神仙的一题 看看除了dp好像没什么其他办法了 想着怎么构个具体的图出来,然鹅不太现实. 于是我们想办法用几个参数来表示dp数组 加了几条边肯定要的吧,于是加个参数$i$表示已加了$i$条边 这显然是不够的.于是我们又想:强连通分量.....连通块....... 于是加个$j$表示还有$j$个强连通分量 于是dp数组为$f[i][j]$ 这是我们发现一个问题,状态$f[i][j]$不一定是合法的. 那dp不就GG了吗 再次撕烤,我们发现每次加上的边无非就3种情况: 1.把2个强