首页 > 代码库 > HDU 4970 Killing Monsters
HDU 4970 Killing Monsters
开始以为是线段树,算了一下复杂度也觉得能过。。。但是这题貌似卡了线段树。。。
具体做法:
对每一个塔,记录attack[l]+=d,attack[r+1]-=d;这样对于每个block,受到的伤害就是前缀和attack[1]+attack[2]+...+attack[i];
从后往前遍历,计算从当前点到结束受到的总的伤害;
ps:貌似很多人都是用树状数组写的。。。写完还是不太懂和树状数组有什么关系。。。orz
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int maxn = 100005 ; 7 8 long long attack[maxn]; 9 long long sum[maxn];10 11 int main (){12 int n,m,l,r,d,k,x,ans;13 long long h;14 while (~scanf ("%d",&n)&&n){15 memset (attack,0,sizeof attack);16 scanf ("%d",&m);17 while (m--){18 scanf ("%d%d%d",&l,&r,&d);19 attack[l]+=d;20 attack[r+1]-=d;21 }22 long long temp=0;23 for (int i=1;i<=n;i++){24 temp+=attack[i];25 attack[i]=temp;26 }27 temp=0;28 for (int i=n;i>=1;i--){29 temp+=attack[i];30 sum[i]=temp;31 }32 scanf ("%d",&k);33 ans=0;34 while (k--){35 scanf ("%I64d%d",&h,&x);36 if (sum[x]<h)37 ans++;38 }39 printf ("%d\n",ans);40 }41 return 0;42 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。