聪明质检员
题目链接:https://www.luogu.com.cn/problem/P1314
题意:
m个区间,规定一个值W,对于每个区间进行有条件约束的求和得到y,求最小的s-y绝对值
思路:
由于查询的区间和数组本身是分离的,所以不能排序数组,然后二分查找!
其实就是二分答案(发现mid和y单调性相关,mid越大,y越小,mid越小,y越大),然后每次都进行相关前缀和预处理处理
时间复杂度O(m*logn)
struct node{
int l,r;
bool operator<(const node&a)const{
return l<a.l;
}
};
node a[maxn];
ll pre[maxn];
node interval[maxn];
ll s,n,m;
ll ans=llmax;
ll prex[maxn];
bool check(int mid){
ll y=0,nums=0,sum=0;
for(int i=1;i<=n;i++)prex[i]=prex[i-1]+(a[i].l>=mid?1:0);
for(int i=1;i<=n;i++)pre[i]=pre[i-1]+(a[i].l>=mid?a[i].r:0);
for(int i=1;i<=m;i++){
int l=interval[i].l,r=interval[i].r;
nums=prex[r]-prex[l-1];
sum=pre[r]-pre[l-1];
y+=nums*sum;
}
ans=min(ans,abs(y-s));
if(y>s)return true;
return false;
}
void solve(){
cin>>n>>m;cin>>s;
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
}
for(int i=1;i<=m;i++){
cin>>interval[i].l>>interval[i].r;
}
int l=0,r=1e16;
while(l<=r){
int m=l+r>>1;
if(check(m)){
l=m+1;
}else{
r=m-1;
}
}
cout<<ans<<endl;
}
``u

浙公网安备 33010602011771号