76分求调整
查看原帖
76分求调整
1068062
Poulnoodles楼主2024/10/20 15:50

以二维为例,当最大长度是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; }

2024/10/20 15:50
加载中...