开O2全过,不开O2 36分,初步判断为p函数输出负数的原因,但是修正后全部WA。
#include <iostream>
#include <cstdio>
#include <cstring>
const int N = 20000025, M = 20000025;
int d[N], a[N];
int A, B, C, m;
struct attact{
int x1, y1, z1, x2, y2, z2;
int attaction;
}att[M];
int p(int a1, int b1, int c1){
if(a1==0||b1==0||c1==0){
return 0;
}
return ((a1 - 1) * B + (b1 - 1)) * C + (c1 - 1) + 1;
}
void change(int x1, int y1, int z1, int x2, int y2, int z2, int D){
d[p(x1, y1, z1)] += D;
d[p(x2 + 1, y1, z1)] -= D;
d[p(x1, y2 + 1, z1)] -= D;
d[p(x1, y1, z2 + 1)] -= D;
d[p(x2 + 1, y1, z2 + 1)] += D;
d[p(x2 + 1, y2 + 1, z1)] += D;
d[p(x1, y2 + 1, z2 + 1)] += D;
d[p(x2 + 1, y2 + 1, z2 + 1)] -= D;
return;
}
bool check(int x){
memset(d, 0, sizeof (d));
for(int i = 1; i <= x; ++i){
change(att[i].x1, att[i].y1, att[i].z1, att[i].x2, att[i].y2, att[i].z2, att[i].attaction);
}
for(int i = 1; i <= A; ++i){
for(int j = 1; j <= B; ++j){
for(int k = 1; k <= C; ++k){
d[p(i, j, k)] = d[p(i - 1, j, k)] + d[p(i, j, k)];
}
}
}
for(int i = 1; i <= A; ++i){
for(int j = 1; j <= B; ++j){
for(int k = 1; k <= C; ++k){
d[p(i, j, k)] = d[p(i, j - 1, k)] + d[p(i, j, k)];
}
}
}
for(int i = 1; i <= A; ++i){
for(int j = 1; j <= B; ++j){
for(int k = 1; k <= C; ++k){
d[p(i, j, k)] = d[p(i, j, k - 1)] + d[p(i, j, k)];
}
}
}
for(int i = 1; i <= A * B * C; ++i){
if(a[i] - d[i] < 0) return 1;
}
return 0;
}
int solve(){
int l, r, mid;
l = 1, r = m + 1;
while(l < r){
mid = l + (r - l) / 2;
if(check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
int main() {
scanf("%d%d%d%d", &A, &B, &C, &m);
for(int i = 1; i <= A * B * C; ++i) {
scanf("%d", &a[i]);
}
for(int i = 1; i <= m; ++i){
scanf("%d%d%d ", &att[i].x1, &att[i].x2, &att[i].y1);
scanf("%d%d%d", &att[i].y2, &att[i].z1, &att[i].z2);
scanf("%d", &att[i].attaction);
}
printf("%d", solve());
return 0;
}
/*
2 2 2 3
1 1 1 1 1 1 1 1
1 2 1 2 1 2 2
1 2 1 2 1 2 1
1 2 1 2 1 2 1
*/