標籤:style blog color os io for div amp
開始以為是線段樹,算了一下複雜度也覺得能過。。。但是這題貌似卡了線段樹。。。
具體做法:
對每一個塔,記錄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 }