别整了,这个题目有问题
人家原题是两秒,到这里变成五秒??
并且测试有问题,不知道为什么AC代码都过不了测试??
听我把过程细细道来
我到现在还坚持,数组的范围应该是10的六次方级别。于是我按照10的六次方写了代码,提交显示如下
代码提交状态: Segmentation Fault
代码运行状态: 错误数据如下所示 ×
输入
100 100 100 1000000
487746112 145532930 120621139 356237384 477939432 496265215 464724124 184541900 628212608 729057858 327781958 744772325 792685697 870650073 165833960 216797450 787757400 551926713 409504187 975820601 838819647 398612326 824640516 365427975 798976802 965793527 303959810 938045166 393748205 413104317 881224356 485149341 483807467 648269873 529716962 774816306 610638770 256440652 295599618 528576492 927531788 658965764 679389240 135032436 735419266 681414805 453462611 294336088 878768625 843084234 748215191 623629528 701446580 959786072 396655698 755321185 918006914 525404707 202850933 830950893 557664655 938848830 222003273 255666482 688543094 784985559 320989283 405299883 547105465 876782830 351354334 308141674 174403421 708894363 653477108 655731971 684782852 962503495 879464641 245999600 309722721 248973609 794163216 171234937 652328965 159101227 387479775 257567591 615158975 509941053 824593941 463086573 829905874 409144215 537536661 728729428 873381405 826372653 460834971 784197957 950018270 385933754 417789157 468025446 841030409 904762190 554693340 586961063 596676238 783561625 885185099 249990756 258643881 142939276 190215544 228812438 276458412 217066882 209017208 939786116 674938057 523220831 486826779 570648236 844198225 154963247 391794391 538891913 475729461 410950794 233131963 862875757 645314531 523990274 407760004 969667485 838599708 409042941 729121352 915806601 509760497 148056026 254624056 524992645 849765980 966135333 398357433 993135257 129468733 590954457 570157175 220040547 360657283 367085743 210341419 812028627 956328751 245338811 685953463 325505394 326926110 908264229 697395083 375420547 807764055 243575554 449730345 197831886 750036139 980052114 354251697 524800838 597176143 183821106 188284826 587384397 316386518 159130689 613776418 153639787 631112437 131611321 259368384 519876418 289749252 639324771 472959399 550384935 998762220 426613514 378832464 152743751 803948288 500429819 350859461 334549874 821362062 7527357…
输出
标准答案
152094
我就去看了题解,现在是2020/04/14只有两个题解,并且这两个题解都把数组开到了2*10^6
,我不知道为什么,本着试一试的心情,我也把自己的数组开到了2*10^6,结果AC了!!!神奇
于是,我就故意又把数组开成10^6,等到报错出现上面的数据,这时候在测试的代码中改回2*10^6
,结果输出是1000000,和答案不一样!!!what?? AC了也过不了这个数据?? 于是我在想会不会AC的测试中没有这个数据,而我的代码有缺陷。于是我就把题解的两个代码复制到了测试区,点击调试代码,神奇的一幕出现了,一个显示1000001,一个报 Segmentation Fault错误,这就不知道为什么了??如果你们知道的话评论告诉我一声,还有为什么要开2*10^6的数组
最后附上我蒟蒻的代码
基于恢复血量的二分+差分。输入的数据其实是按照攻击排好序的(不要问我题中没说,不放心可以拍一下序),然后取[1,m]中点mid,实施[1,mid]的攻击,如果此时爆掉了,那么说明答案在[1,mid]中,再取中点mid1,恢复[mid1+1,mid]的血量……,其实就是向左恢复血量;如果没爆掉,需要再次施加攻击,向右施加攻击,减少血量。为了判断是恢复还是继续攻击需要记录上次的中点。剩下的就是三维差分+前缀和了,这个网上一堆教程,需要注意的是随着维度的升高,容斥原理也越来越复杂,我们就可以采取降维的处理,例如,假如你不知道二维的容斥原理(虽然很简单,这只是个假设),但你知道一维的容斥原理,你就可以对二维中的每一行做一维容斥,然后对每一列在做一次容斥,这个过程就是降维+升维,推广到n维,你就知道怎么做n维容斥了,别的没什么需要注意的了
#include<cstdio>
#include<vector>
#include <algorithm>
#include<cmath>
#include<cstring>
#include<iostream>
#include<time.h>
#include<queue>
#define PP(a,b) cout<<a<<"="<<b<<endl
#define P(a) cout<<a<<endl
#define print(a) cout<<#a<<"="<<a<<endl
#define _for(i,s,e) for(int i=s;i<=e;i++)
using namespace std;
int a,b,c,m;
struct {
long long x1,x2,y1,y2,z1,z2,attack;
} attack[2000005];
long long ship[2000005];
long long chafen[2000005];
int getindex(long long x,long long y,long long z)
{
return (x-1)*c*b+(y-1)*c+(z-1)+1;
}
void show(int x,int y,int z,int a[])
{
_for(i,1,x)
{
_for(j,1,y)
{
_for(k,1,z)
cout<<a[getindex(i,j,k)]<<" ";
cout<<endl;
}
cout<<endl;
}
}
bool at(long long s,long long e,int op)
{
bool flag=0;
memset(chafen,0,sizeof(chafen));
_for(i,s,e)
{
chafen[getindex(attack[i].x1,attack[i].y1,attack[i].z1)]+=op*attack[i].attack;
chafen[getindex(attack[i].x2+1,attack[i].y1,attack[i].z1)]-=op*attack[i].attack;;
chafen[getindex(attack[i].x1,attack[i].y2+1,attack[i].z1)]-=op*attack[i].attack;
chafen[getindex(attack[i].x1,attack[i].y1,attack[i].z2+1)]-=op*attack[i].attack;
chafen[getindex(attack[i].x2+1,attack[i].y2+1,attack[i].z1)]+=op*attack[i].attack;
chafen[getindex(attack[i].x2+1,attack[i].y1,attack[i].z2+1)]+=op*attack[i].attack;
chafen[getindex(attack[i].x1,attack[i].y2+1,attack[i].z2+1)]+=op*attack[i].attack;
chafen[getindex(attack[i].x2+1,attack[i].y2+1,attack[i].z2+1)]-=op*attack[i].attack;
}
_for(i,1,a) _for(j,1,b) _for(k,1,c) chafen[getindex(i,j,k)]+=chafen[getindex(i-1,j,k)];
_for(i,1,a) _for(j,1,b) _for(k,1,c) chafen[getindex(i,j,k)]+=chafen[getindex(i,j-1,k)];
_for(i,1,a) _for(j,1,b) _for(k,1,c) chafen[getindex(i,j,k)]+=chafen[getindex(i,j,k-1)];
// _for(i,1,a) _for(j,1,b) _for(k,1,c) ship[getindex(i,j,k)]+=ship[getindex(i-1,j,k)];
// _for(i,1,a) _for(j,1,b) _for(k,1,c) ship[getindex(i,j,k)]+=ship[getindex(i,j-1,k)];
_for(i,1,a) _for(j,1,b) _for(k,1,c)
{
ship[getindex(i,j,k)]+=chafen[getindex(i,j,k)];
if(ship[getindex(i,j,k)]<0) flag=1;
}
//show(a,b,c,ship);
if(flag) return 1;
return 0;
}
int main()
{
// freopen("input.txt","r",stdin);
cin>>a>>b>>c>>m;
_for(i,1,a)
_for(j,1,b)
_for(k,1,c)
cin>>ship[getindex(i,j,k)];
// show(a,b,c,ship);
_for(i,1,m)
cin>>attack[i].x1>>attack[i].x2>>attack[i].y1>>attack[i].y2>>attack[i].z1>>attack[i].z2>>attack[i].attack;
long long l=1,r=m;
long long lmid=0;
while(l<r)
{
long long mid=(l+r)/2;
if(lmid<mid)
{
if(at(l,mid,-1))r=mid;else l=mid+1;
}
else
{
if(at(mid+1,r,1)) r=mid; else l=mid+1;
}
lmid=mid;
}
cout<<l;
return 0;
}