using namespace std;
#define int long long
struct node
{
int x1,x2,y1,y2,z1,z2,add;
}pro[7000100];
int n,m,l,q,a[7000100],qzh[7000100],cnt;
int id(int x,int y,int z)
{
return x*(m+1)*(l+1)+y*(l+1)+z+1;
}
bool check(int x)
{
for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=m+1;j++)
{
for(int k=0;k<=l+1;k++)
{
qzh[id(i,j,k)]=0;
}
}
}
for(int i=1;i<=x;i++)
{
int x1=pro[i].x1,x2=pro[i].x2,y1=pro[i].y1;
int y2=pro[i].y2,z1=pro[i].z1,z2=pro[i].z2;
qzh[id(x1,y1,z1)]+=pro[i].add;
qzh[id(x1,y1,z2+1)]-=pro[i].add;
qzh[id(x1,y2+1,z1)]-=pro[i].add;
qzh[id(x2+1,y1,z1)]-=pro[i].add;
qzh[id(x1,y2+1,z2+1)]+=pro[i].add;
qzh[id(x2+1,y1,z2+1)]+=pro[i].add;
qzh[id(x2+1,y2+1,z1)]+=pro[i].add;
qzh[id(x2+1,y2+1,z2+1)]-=pro[i].add;
}
for(int i=1;i<=n+1;i++)//n+1改为n
{
for(int j=1;j<=m+1;j++)//m+1改为m
{
for(int k=1;k<=l+1;k++)//l+1改为l
{
qzh[id(i,j,k)]+=qzh[id(i,j,k-1)];
qzh[id(i,j,k)]+=qzh[id(i,j-1,k)];
qzh[id(i,j,k)]+=qzh[id(i-1,j,k)];
qzh[id(i,j,k)]-=qzh[id(i,j-1,k-1)];
qzh[id(i,j,k)]-=qzh[id(i-1,j-1,k)];
qzh[id(i,j,k)]-=qzh[id(i-1,j,k-1)];
qzh[id(i,j,k)]+=qzh[id(i-1,j-1,k-1)];
if(qzh[id(i,j,k)]>a[id(i,j,k)])
{
return false;
}
}
}
}
return true;
}
signed main()
{
cin>>n>>m>>l>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=l;k++)
cin>>a[id(i,j,k)];
for(int i=1;i<=q;i++)
{
cin>>pro[i].x1>>pro[i].x2>>pro[i].y1>>pro[i].y2>>pro[i].z1>>pro[i].z2>>pro[i].add;
}
int L=1,R=q,res=0;
while(L<=R)
{
int mid=L+R>>1;
if(check(mid))L=mid+1;
else R=mid-1,res=mid;
}
cout<<res<<endl;
}
P8666三体攻击
如果将上面注释的地方改了的话就会错,十分不理解
(因为前缀和显然用不到越界的地方,可是实际上越界的地方却会对没有越界的地方产生影响)