NOIP2011聪明的质检员

题目来源:https://www.luogu.org/problem/show?pid=1314


对w进行二分答案。


处理过程中用前缀和优化。


注意要二分两次,一次是ws时w-s的最小值。


代码:


#include 
#include 
#include 
#include 
#include 
#define ll long long
using namespace std;
const int maxn=2e6+10;
ll w[maxn],v[maxn];
ll sum[maxn],e[maxn];
ll start[maxn],end[maxn];
int main()
{
    ios::sync_with_stdio(false);
    ll n,m,s;
    cin>>n>>m>>s;
    for(int i=1;i<=n;i++)cin>>w[i]>>v[i];
    for(int i=1;i<=m;i++)cin>>start[i]>>end[i];
    ll l=0,r=1e16;
    ll ans=1e16;
    while(l=mid)
            {
                sum[i]+=v[i];
                e[i]++;
            }
        }
        ll tot=0;
        for(int i=1;i<=m;i++)tot+=(e[end[i]]-e[start[i]-1])*(sum[end[i]]-sum[start[i]-1]);
        if(tot>s||(s-tot)>=ans)r=mid-1;
        else l=mid;
        ans=min(ans,abs(tot-s));
    }
    l=0;r=1e16;
    while(l=mid)
            {
                sum[i]+=v[i];
                e[i]++;
            }
        }
        ll tot=0;
        for(int i=1;i<=m;i++)tot+=(e[end[i]]-e[start[i]-1])*(sum[end[i]]-sum[start[i]-1]);
        if(s>tot||(s-tot)>=s)r=mid-1;
        else l=mid;
        ans=min(ans,abs(tot-s));
    }
    cout<


你可能感兴趣的:(#,杂项算法)