求助
查看原帖
求助
704275
无名之雾楼主2024/10/20 22:14
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
inline void write(int x){
    if(x==0){putchar('0');return;}
	int len=0,k1=x,c[10005];
	if(k1<0)k1=-k1,putchar('-');
	while(k1)c[len++]=k1%10+'0',k1/=10;
	while(len--)putchar(c[len]);
}
const int N=2e5+5,mod=1e9+7;
int m[N],a[N],flag[N];
struct node{int val,id;}ans[N];
bool cmp(node a,node b){return a.val>b.val;}
int qpow(int a,int b){
	int ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod,b>>=1;
	}
	return ans;
}
signed main(){
	int n=read(),cnt=0;
	for(int i=1;i<=n;i++)m[i]=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=0;i<n;i++){
		ans[i*2+1]={a[i+1]-1,i+1};
		ans[i*2+2]={m[i]-a[i+1],i+1};
	}
	sort(ans+1,ans+n*2+1,cmp);
	for(int i=1;i<=n*2;i++){
		if(!flag[ans[i].id])flag[ans[i].id]=1,cnt=(cnt+ans[i].val*qpow(2,n-i+1)%mod)%mod;
		else{cnt=(cnt+ans[i].val*qpow(2,n-i)%mod)%mod;break;}
	}
	cout<<cnt%mod;
	return 0; 
}

大概思路就是 将每个 ai1,miaia_i-1,m_i-a_i 存进数组 bb,然后对 bb 进行升序排序。排完之后,从前往后枚举,直到找到第一个另一部分已经被统计过的 bib_i

但可能写的有点神秘,求调

2024/10/20 22:14
加载中...