【巧妙转化+二分答案】AGC040D

\(n\)条长为\(1\)的平衡木,小P和小Q打算用这些平衡木玩游戏

已知小P会花\(a_i\)秒走完第\(i\)条平衡木,小Q会花\(b_i\)秒走完第\(i\)条平衡木。他们会把这些平衡木拼成一条长为\(n\)的平衡木,然后小P会从起点开始走,小Q会在平衡木上随便选一个点开始走。

小P可以获胜当且仅当小Q走到终点时,小P追上了小Q。

现在小P想弄出个排列顺序,让她的胜率最大化。你要求出这个最大胜率,答案以最简分数形式输出。


感受一下可以发现能让小P获胜的点的位置是一个前缀【】

然后可以以\(x\)轴为移动距离,\(y\)轴为移动时间建立平面直角坐标系,画出小P和小Q移动的折线【】它们会有一些交点【】

然后随便感受一下又可以发现,把小Q的折线向下平移到与小P的折线只有一个交点时,小Q的折线与\(x\)轴交点的横坐标就是小P可以获胜的区间的右端点【】

设小P小Q(平移后)的折线交于\((x0,y0)\)于是可以新弄出一条折线\(C\),满足在\(x0\)之前的折线都是以\(b\)为斜率,在\(x0\)以后的折线都是以\(a\)为斜率【这个思路很妙,要考的OWO】

显然\(C\)的终点一定是在\((n,S)\;(S=\sum\limits_{i=1}^n a_i)\)【】

于是为了让\(C\)的横坐标最大,你就必须选尽量少的直线,即选斜率比较大的直线【】

然后可以知道直线\(i\)的贡献为\(max(a_i,b_i)\),达到这个贡献的方法就是把\(a_i<b_i\)的直线放\(x_0\)左边,其它放\(x0\)右边【】

于是做法就比较显然乐:先把直线按\(max(a_i,b_i)\)从大到小排序,然后枚举\(C\)\(x\)轴的交点在哪条直线上,设为\(k\),然后二分选多少条直线,必须要满足\(\sum\limits_{i=1}^{mid} max(a_i,b_i)+b_k\geq S,\sum\limits_{i=1}^{mid}max(a_i,b_i)<S\)才是合法的【】

然后就可以欢乐地算出分子的整数部分乐【】小数部分特殊处理一下就行乐【】

#include <bits/stdc++.h>
#define N 100005
#define ll long long
#define For(i,x,y) for(int i=(x);i<=(y);++i)
#define pll pair<ll,ll>
#define fr first
#define sd second
using namespace std;

pll a[N];
ll ansx=0,ansy=1,sum[N],S=0;
bool cmp(const pll &a,const pll &b){ return a.fr>b.fr; }
ll calc(int x,int y){ return y<=x?sum[x]-a[y].fr:sum[x]; }
ll gcd(ll x,ll y){ return x%y?gcd(y,x%y):y; }

int main(){
    int n; scanf("%d",&n);
    For(i,1,n){
        scanf("%lld%lld",&a[i].fr,&a[i].sd);
        S+=a[i].fr;
        a[i].fr=max(a[i].fr,a[i].sd);
    }
    sort(a+1,a+n+1,cmp);
    For(i,1,n) sum[i]=sum[i-1]+a[i].fr;
    For(i,1,n){
        int l=0,r=n,num=-1;
        while(l<=r){
            int mid=(l+r)>>1;
            if(calc(mid,i)>=S-a[i].sd) num=mid,r=mid-1;
            else l=mid+1;
        }
        if(num<0) continue;
        if(calc(num,i)>=S) continue;
        ll nowx=1ll*(1ll*n-(num-(i<=num)))*a[i].sd-S+calc(num,i),nowy=1ll*n*a[i].sd;
        ll p=gcd(nowx,nowy);nowx/=p,nowy/=p;
        if(1.0*nowx*ansy>1.0*nowy*ansx) ansx=nowx,ansy=nowy;        
    }
    printf("%lld %lld\n",ansx,ansy);
}

猜你喜欢

转载自www.cnblogs.com/PsychicBoom/p/11938984.html