D. Salary Changing
题目链接
题目意思自己翻译。
题解我写过一遍的,被记事本和edge搞死了,总之就是二分,看不懂去其他家看看把,1点了,睡了!
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
long long int t,n,l[200007],r[200007],s,ansm;
struct madoka{
long long int l;
long long int r;
bool operator < (const madoka & a) const
{
return l>a.l;
}
}lin;
priority_queue <madoka> ho;
int find(long long int k,long long int s){
long long int lsum=0,rsum=0,sum=s;
for(int i=1;i<=n;i++){
if(k>r[i]){
lsum++;
sum-=l[i];
}
else if(k<l[i]){
rsum++;
sum-=l[i];
}
else{
lin.l=l[i];
lin.r=r[i];
ho.push(lin);
}
}
int m=n/2;
while(!ho.empty()){
if(lsum<m){
lsum++;
sum-=ho.top().l;
ho.pop();
continue;
}
if(rsum<m){
rsum++;
sum-=k;
ho.pop();
continue;
}
sum-=k;
ho.pop();
}
if(sum>=0&&lsum==rsum){
return 1;
}
else if(lsum==rsum){
return 4;
}
else if(lsum>rsum)return 2;
else{
return 3;
}
}
int main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&s);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&l[i],&r[i]);
}
long long int rr=2000000000000000000,ll=1,ans=(rr+ll)/2;
while(ll!=ans){
int look=find(ans,s);
if(look==1){
ansm=ans;
ll=ans;
ans=(ll+rr)/2;
}
else if(look==2){
rr=ans;
ans=(ll+rr)/2;
}
else if(look==3){
ll=ans;
ans=(ll+rr)/2;
}
else{
rr=ans;
ans=(ll+rr)/2;
}
}
printf("%lld\n",ansm);
}
return 0;
}