以二维为例,当最大长度是ax,ay,黑洞坐标是x,y,最终答案是min(ax-x,ay-y)+min(ax-x,y-1)+min(x-1,ay-y)+min(x-1,y-1)+1。
延伸到多维,则最终答案也可以表示为2^n+1个数的和,除了表示黑洞的1,剩下的数字均为n个数的最小值,且第i个数为ai_max-ai或ai-1。
我最后几个测试点超时了,求调整。```cpp
#include
#include
using namespace std;
long long n,a[10000000][2],con[10000000],ans;
struct st{
long long an;
long long num;
}na[10000000];
bool compare(const st&k,const st&b){
return k.an<b.an;
}
long long f(long long k,long long b){
long long p=1,m=2;
if(b==0)return k;
while(p2<b){
m=m;
p*=2;
m=m%1000000007;
}
while(p<b){
m*=2;
p++;
m=m%1000000007;
}
return km%1000000007;
}
int main(){
cin>>n;
for(long long i=1;i<=n;i++){
cin>>a[i][0];
}
for(long long i=1;i<=n;i++){
cin>>a[i][1];
}
for(long long i=1;i<=n;i++){
na[i2-1].an=a[i][0]-a[i][1];
na[i2].an=a[i][1]-1;
na[i2-1].num=i2-1;
na[i2].num=i2;
}
sort(na+1,na+n2+1,compare);
for(long long i=1;i<=n*2;i++){
int j=0,p=(na[i].num+1)/2;
long long m=na[i].an;
p++;
while(p<=n){
if(con[p]==0)j++;
p++;}
p=(na[i].num+1)/2;
p--;
while(p>0){
if(con[p]==0)j++;
p--;
}
m=f(m,j);
ans+=m;
ans%=1000000007;
con[(na[i].num+1)/2]++;
if(con[(na[i].num+1)/2]==2)break;
}
cout<<(ans+1)%1000000007;
}