1 条题解
-
0
自动搬运
来自洛谷,原作者为

LiuCarry
只可惜没有如果。搬运于
2025-08-24 23:05:21,当前版本为作者最后更新于2024-10-20 16:58:40,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
52pts
我们可以将空间分为 份,每份是以黑洞为原点的坐标系的每个坐标轴的半轴的交集,半轴可以取正或负,因此是 份。
这样枚举每个坐标 ,答案就是对每一份,每个方向上到边界的距离的最小值的和,即 或 ,时间复杂度 。
100pts
然后考虑每个 对答案的贡献。
我们先把 和 列出来,比如对于这个样例:
3 5 7 8 4 5 2我们把它写成:
3 1 4 2 1 6第一个是 ,第二个是 ,我们分别称他们为 和 。
这样的话答案就是每一个 取 或 的这一个路径上的最小值和,因此只有一个从上到下的路径的最小值可以对答案产生贡献。
我们将 和 合起来,排个序,发现贡献就是 ,其中 是当前枚举到的数, 是 和 都没有被取到的 的个数,即 和 都大于 的 的个数。还有别忘了开
long long和初始时令 。code
#include<bits/stdc++.h> #define int long long using namespace std; const int mod=1e9+7; int n; int m[200005]; int a[200005]; int ans=1; vector<pair<int,int>> vec; int cnt[200005]; bool bo=0; int cnt2; int qpow(int x,int y) { if(y==0) return 1; if(y==1) return x; int res=qpow(x,y>>1); return y&1?(res*res%mod*x%mod):(res*res%mod); } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for(int i=1;i<=n;i++) cin>>m[i]; for(int i=1;i<=n;i++) cin>>a[i]; vec.resize(2*n); for(int i=1;i<=n;i++) { vec[2*(i-1)]={a[i]-1,i}; vec[2*(i-1)+1]={m[i]-a[i],i}; cnt[i]=2; } cnt2=n; sort(vec.begin(),vec.end()); int num,I; for(int i=0;i<2*n&&!bo;i++) { num=vec[i].first; I=vec[i].second; cnt[I]--; if(!cnt[I]) bo=1; if(cnt[I]) cnt2--; int res=num*qpow(2,cnt2)%mod; ans=(ans+res)%mod; } cout<<ans; return 0; }
- 1
信息
- ID
- 10878
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者