题目链接: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