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 }