首页 > 其他分享 >题解 [NOIP2011 提高组] 聪明的质监员

题解 [NOIP2011 提高组] 聪明的质监员

时间:2023-07-11 20:47:34浏览次数:49  
标签:NOIP2011 int 题解 LL 质监 mid sumn ge sumv

题目链接

不难发现,\(W\) 越大,\(y_i\) 以及 \(y\) 就越小,\(W\) 越小,\(y_i,y\) 就越大。

所以这是一个二分答案。

考虑如何 \(check\)。

观察

\[y_i=\sum\limits_{j=l_i}^{r_i}[w_j \ge W] \times \sum\limits_{j=l_i}^{r_i}[w_j \ge W]v_j \]

不难发现,乘号的前后都是区间和的形式,有因为要计算多个区间,所以想到前缀和。

对于一个二分的 \(W\),将 \(\ge W\) 的拿出来做前缀和,在计算时即可 \(O(1)\) 调用。

代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
LL read() {
    LL sum=0,flag=1; char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') flag=-1; c=getchar();}
    while(c>='0'&&c<='9') {sum=sum*10+c-'0'; c=getchar();}
    return sum*flag;
}

const int N=2e5+10,INF=1e6+10;
int n,m;
int a[N],b[N];
LL s;
LL w[N],v[N];
LL sumn[N],sumv[N];

LL calc(int tw) {
    for(int i=0;i<=n;i++) sumn[i]=sumv[i]=0;
    for(int i=1;i<=n;i++) {
        if(w[i]>=tw) {
            sumn[i]=sumn[i-1]+1;
            sumv[i]=sumv[i-1]+v[i];
        }
        else {
            sumn[i]=sumn[i-1];
            sumv[i]=sumv[i-1];
        }
    }
    LL tot=0;
    for(int i=1;i<=m;i++) {
        tot+=(sumn[b[i]]-sumn[a[i]-1])*(sumv[b[i]]-sumv[a[i]-1]);
    }
    return tot;
}

LL find1() {
    int l=0,r=INF;
    while(l<r) {
        int mid=l+r>>1;
        if(calc(mid)<=s) r=mid;
        else l=mid+1;
    }
    return calc(r);
}

LL find2() {
    int l=0,r=INF;
    while(l<r) {
        int mid=l+r+1>>1;
        if(calc(mid)>=s) l=mid;
        else r=mid-1;
    }
    return calc(l);
}

int main() {
    cin>>n>>m>>s;
    for(int i=1;i<=n;i++) {
        cin>>w[i]>>v[i];
    }
    for(int i=1;i<=m;i++) {
        cin>>a[i]>>b[i];
    }
    LL ansa=s-find1();
    LL ansb=find2()-s;
    cout<<min(ansa,ansb);
    return 0;
}

标签:NOIP2011,int,题解,LL,质监,mid,sumn,ge,sumv
From: https://www.cnblogs.com/zhangyuzhe/p/17545857.html

相关文章

  • 【开机10】解决出现问题,你的PIN不可用,单击以重新设置PIN 无法打开相机 设置我的PIN 登
    \(弄了1.5个小时,找到这个视频,终于弄好了!!!!!!\)\(如果各位基友出现这种问题,可以参考。\)【开机10】解决出现问题,你的PIN不可用,单击以重新设置PIN无法打开相机设置我的PIN登录选项诊断启动禁用服务后问题解决......
  • 洛谷 P4869 albus就是要第一个出场 题解
    洛谷P4869albus就是要第一个出场题意给定一个长度为\(n\)的序列\(A\),设可重集合\(S=\left\{\operatorname{xor}_{i=1}^nA_ix_i\midx_i\in\{0,1\}\right\}\),即\(S\)为\(A\)的所有子集的异或和构成的集合。给定一个数\(k\),求\(k\)在\(S\)中的排名。如果\(S\)中......
  • AT_abc306_h 题解
    AT_abc306_hBalanceScale题解Links洛谷AtCoderDescription有\(N\)个编号为\(1,2,\dots,N\)的砝码。有\(M\)次比较操作,每次比较砝码\(A_{i}\)和\(B_{i}\),\(A_{i}\)在左侧。分为三种情况:左边的砝码更重。右边的砝码更重。两边的砝码重量相同。将每次比较的......
  • CF878E 题解
    CF878ENumbersontheblackboard题解Links洛谷CodeforcesDescription给出\(n\)个数字,每次询问一个区间\([l,r]\),对这个区间内部的点进行如下操作。每次操作可以合并相邻两个数\(x,y\),用\(x+2y\)替换它们。对于每次询问,输出当最后只剩下一个数字时,这个数字的最大......
  • CODE FESTIVAL 2017 Final J 题解
    problem&blog。萌萌点分治,积累个trick/qq。对于完全图\((V,E)\),将\(E\)分成\(E_1,E_2,\cdots,E_k\)(\(E_1\cupE_2\cup\cdots\cupE_k=E\))。对每个边集求MST,得到新边集\(E_1^{'},E_2^{'},\cdots,E_k^{'}\),再求MST。最终剩下的边集,等同于原边集的MST。......
  • P4016题解
    本题是一个比较经典的问题(环形均分纸牌问题),我也不知道为什么它在网络流24题里面出现。但是作为一道比较典的排序算法的题,还是放出来讲一下。solution假设\(a_1\)给\(a_n\)了\(x_1\)张纸牌,\(a_2\)给\(a_1\)了\(x_2\)张纸牌......(\(x_i\)可正可负)。因此操作数量为......
  • P2886题解
    题目大意给定起点\(S\)和终点\(T\),求从起点到终点恰好经过\(N\)(\(N\)给定)条边的最短路径。solution发现本题点数巨多,但是边数小到可怜,我们可以只保留了一部分点,先判断连通性,不连通直接输出即可。当\(S\)和\(T\)连通时,我们设\(G^k\)为经过\(k\)条边后最短路的邻......
  • Largest-Smallest-Cyclic-Shift题解
    题目链接本题码量不大,但是事实上是一道极其难想的思维题。题目描述你有\(a\)个a,\(b\)个b,\(c\)个c。要求用这\(a+b+c\)个字母拼接成一个字符串,使得这个字符串的最小表示法在所有能拼成的字符串中最大。补充:最小表示法,将一个字符串的最后一个字符放到首位,重复这个操作,......
  • AT-abc214-g题解
    题目描述给定两个排列\(p,q\),要求统计满足\(\foralli,r_i\not=p_i,r_i\not=q_i\)的排列\(r\)的数量。对\(1000000007\)取模数据范围\(n\le3000\)。solution本题要求统计数量,反正我想了半天没想到怎么正向统计(bushi),因此我们考虑容斥。设\(h_i\)为只看其中......
  • P3599题解
    本题是一道比较典的构造题,拿来扩宽扩宽大家的眼界吧。Task1试判断能否构造并构造一个长度为\(n\)的\(1\simn\)的排列,满足其\(n\)个前缀和在模\(n\)的意义下互不相同。很容易想到的一点是:\(n\)一定排在第一位,因为如果排在别的位,加上\(n\)后在模\(n\)意义下是不......