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 }

 

posted @ 2014-08-20 21:10  galaxy77  阅读(198)  评论(0编辑  收藏  举报