D. Salary Changing

mac2024-01-30  34

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; }
最新回复(0)