先输入一个n表示一共有n个格子,然后输入k表示有k个攻击塔,紧跟k行数据,每行三个数字l,r,d,表示该攻击塔可以在l到r范围内造成d的伤害,然后输入一个m后面跟m行,每行两个数字h,x分别表示该怪物的血量和位置,怪物们将从他的位置x走到n,问能活着走到的有几只怪物。
dalao说这是一种懒操作 线性区间更新的懒操作
将l~r的区间每个都加d 我们只想知道每个点的具体值 所以就不用树状数组、线段树什么的 只用将它a[l]+d,a[r+1]-d,从前往后扫一遍就能得到
先从前往后扫一遍得到每个点每次受到的攻击 再从后往前 得到从i走到n所受的总伤害
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define ll long long const int N=1e5+5,M=10000+5,inf=0x3f3f3f3f,P=9999973; int n,m,k,ans; ll a[N],hur[N],d,h; template <class t>void rd(t &x){ x=0;int w=0;char ch=0; while(!isdigit(ch)) w|=ch==‘-‘,ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=w?-x:x; } int main(){ // freopen("in.txt","r",stdin); while(scanf("%d",&n)==1&&n){ memset(hur,0,sizeof(hur)); memset(a,0,sizeof(a)); ans=0; rd(m); for(int i=1,l,r;i<=m;++i) rd(l),rd(r),rd(d), a[l]+=d,a[r+1]-=d; ll ret=0; for(int i=1;i<=n;++i) ret+=a[i],a[i]=ret; //从前往后 扫出在i点受到的伤害 for(int i=n;i;--i) hur[i]=hur[i+1]+a[i]; rd(k); for(int i=1,x;i<=k;++i){ rd(h),rd(x); if(hur[x]<h) ++ans; } printf("%d\n",ans); } return 0; }
原文地址:https://www.cnblogs.com/lxyyyy/p/11333985.html
时间: 2024-10-09 11:19:51