首页 > 代码库 > hdu 4970 killing monster 代代相传刷qq 不用线段树啦~
hdu 4970 killing monster 代代相传刷qq 不用线段树啦~
【题意】塔防游戏,一条n长的路上,有m个炮台,可以覆盖[li,ri]范围,威力ci,即每一秒,炮塔可以对范围 内的怪物可以造成ci点伤害。只有有q只怪物,每只怪物有hi点血,出现位置为xi;当怪物血量减少到0或以下时消失,怪物一直朝n位置前进。问有几只怪物可以离开这条路。
【题解】用线段树可以做,不过还好我们有代代相传的刷qq 算法 ,让解法变得简单的多~ ^_^
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 7 using namespace std; 8 __int64 num[100005]; 9 10 struct node{__int64 hp,x;}m[100005];11 12 int cmp(node a,node b)13 {14 return a.x<b.x;15 }16 17 int main()18 {19 int n,k,a,b,d;20 while(~scanf("%d",&n),n)21 {22 scanf("%d",&k);23 memset(num,0,sizeof(num));24 while(k--)25 {26 scanf("%d%d%d",&a,&b,&d);27 num[a]+=d;28 num[b+1]-=d;29 }30 __int64 sum=0;31 for(int i=0;i<=n;i++)32 {33 sum+=num[i];34 num[i]=sum;35 }36 //num[i]:每个点i的攻击力度37 scanf("%d",&k);38 for(int i=0;i<k;i++)39 scanf("%I64d%I64d",&m[i].hp,&m[i].x);40 sort(m,m+k,cmp);41 sum=0;42 int ans=0,j=k-1;43 for(int i=n;i>=0;i--)44 {45 sum+=num[i]; // sum:从点n到点i 怪物会受到的总攻击力度46 while(i==m[j].x) // 可能有好几个怪物从点i冒出来47 {48 if(m[j].hp>sum)49 ans++;50 j--;51 if(j<0)52 break;53 }54 if(j<0)55 break;56 }57 printf("%d\n",ans);58 }59 return 0;60 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。