hdu4970

//和hdu1556差不多,不过hdu1556时间是3s , 可以用线段树过

//开一个n的数组a[n],对于每一个tower变换l , r , d

//a[l]+=d , a[r+1]-=d;

//从1到n扫一遍,a[i] += a[i-1]

//那么a[i]里存的·就是第i个位置受到的伤害

#include<cstdio>

#include<iostream>

#include<cstring>

using namespace std ;

const int maxn = 100010 ;

typedef __int64 ll ;

ll a[maxn] ;

int main()

{

int n  ;

while(~scanf("%d" ,&n) &&n)

{

memset(a ,  0 , sizeof(a)) ;

int m ;

scanf("%d" ,&m) ;

int l , r ;

ll d ;

while(m--)

{

scanf("%d%d%I64d" ,&l , &r , &d) ;

a[l] += d ;

a[r+1] -= d;

}

for(int i = 2;i <= n;i++)

a[i] += a[i-1] ;

for(int i = n-1;i > 0;i--)

a[i] += a[i+1] ;

int k ;

int ans = 0 ;

scanf("%d" ,&k) ;

while(k--)

{

ll h ; int x ;

scanf("%I64d%d" ,&h , &x) ;

if(a[x] < h)

ans++ ;

}

printf("%d\n" ,ans) ;

}

return  0;

}

时间: 2024-10-27 07:28:47

hdu4970的相关文章

HDU4970 Killing Monsters dp

题意:给你n个操作,每一次对区间相加,询问区间和. 解题思路:这里没有动态更新, 所以我们用括号匹配那种方法就行 就是 a[l] + x  ,a[r+1] -x 这种做法. 解题代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #define MAX 100005 6 #define LL long long 7 LL a[10

hdu4970 Killing Monsters (差分数列)

2014多校9 1011 http://acm.hdu.edu.cn/showproblem.php?pid=4970 Killing Monsters Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 331    Accepted Submission(s): 198 Problem Description Kingdom Rush

hdu4970(线性区间更新的懒操作)

思路是求出从每一点出发走到终点分别要受到多少伤害,然后和每个怪兽的血量比一下.给一个数组,告了哪些区间需要更新,我需要的就是都更新以后每个点的伤害值是多少.不涉及到区间查询,没必要用线段树或树状数组(据说用了也会超时..).如果每个区间都一个for循环把对应的几个数更新了,必然超时.那么这里的技巧就是一种懒操作.需要a[l]到a[r]每个加d,那么我就标记a[l]+=d;a[r+1]-=d;几组更新都标好了以后,扫一遍数组,把这些信息加上就行了.时间复杂度O(n). 这种技巧非常实用. #inc

【HDU4970】Killing Monsters

HDU - 4970 Killing Monsters 先输入一个n表示一共有n个格子,然后输入k表示有k个攻击塔,紧跟k行数据,每行三个数字l,r,d,表示该攻击塔可以在l到r范围内造成d的伤害,然后输入一个m后面跟m行,每行两个数字h,x分别表示该怪物的血量和位置,怪物们将从他的位置x走到n,问能活着走到的有几只怪物. dalao说这是一种懒操作 线性区间更新的懒操作 将l~r的区间每个都加d 我们只想知道每个点的具体值 所以就不用树状数组.线段树什么的 只用将它a[l]+d,a[r+1]-

hdu 4970 树状数组区间更新 思维题

http://acm.hdu.edu.cn/showproblem.php?pid=4970 好像还没有用树状数组写过区间更新,但是树状数组的确比线段树快很多,不知道跟ZKW线段树比效率怎么样: 先贴个模板: #include <cstdio> const int MAXN = 1024; int B[MAXN], C[MAXN]; #define LOWBIT(x) ((x)&(-(x))) void bit_update(int *a, int p, int d) { for (

Codeforces Round #262 (Div. 2)C(二分答案,延迟标记)

这是最大化最小值的一类问题,这类问题通常用二分法枚举答案就行了. 二分答案时,先确定答案肯定在哪个区间内.然后二分判断,关键在于怎么判断每次枚举的这个答案行不行. 我是用a[i]数组表示初始时花的高度,b[i]表示要达到当前枚举的答案(即mid的值)需要这朵花再涨多少.这两个数组很好算,关键是一次浇连续的w朵花,如何更新区间(暴力的O(n2)的去更新就超时了)?可以用线段树,但是这道题没有涉及区间查询,就是在一个数组上更新区间,用线段树未免小题大做.那么其实这种更新就用延迟标记的思想(懒操作)就

省赛训练赛(---)

A.HDU4968 最大gpa为从最大区间开始,每次取区间最小分数. 最小gap为从最小区间开始,每次取区间最大分数. #include<bits/stdc++.h> using namespace std; int ave,n; int x[10] = {0,85,80,75,70,60}; double xx[10] = {0,4,3.5,3,2.5,2}; int y[10] = {0,69,74,79,84,100}; double yy[10] = {0,2,2.5,3,3.5,4}