zoukankan      html  css  js  c++  java
  • [BC]BestCoder Round#86小结

    1001

    【题意】

    给定一个长度为n(n<=100000)的正整数序列,给出m(m<=100000)个子集合和的记录,问哪些一定比正确的记录多了

    【题解】

    对正整数序列求和,记录比和大的一定记录多了

    HackPoint:sum要开long long

    int v[100005];
    int main(){
        int T=gi;
        while(T--){
            int n,m;n=gi,m=gi;ll sum=0;
            FOR1(i,n)v[i]=gi,sum+=v[i];
            FOR1(i,m){
                ll p;scanf("%I64d",&p);
                if(p>sum)printf("1");
                else printf("0");
            }puts("");
        }
    }

    1002

    【题意】

    给定一个长度为n(n<=100000)的序列,选择一个数并删除它。每个数被选中的概率相等,求删数后相邻两数差值绝对值最大值的期望*n的值

    【题解】

    一眼看上去个multiset????

    然后在开黑组里问了下10*100000*6*multiset能不能过

    然后zzq:

    OK(H~YC[JX}]1YO]RPH`YW7

    然后写了个multiset过来pretest

    int a[100005];
    int b[100005];
    #define era(x) s.erase(s.lower_bound(x))
    int main(){
        int T=gi;
        while(T--){
            int n=gi;
            FOR1(i,n)a[i]=gi;
            ll ans=0;
            multiset<int,greater<int> >s; 
            FOR1(i,n-1)s.insert(abs(a[i+1]-a[i])); 
            for(int i=2;i<n;i++){
                era(abs(a[i]-a[i-1]));
                era(abs(a[i+1]-a[i]));
                s.insert(abs(a[i+1]-a[i-1]));
                ans+=*s.begin();
                s.insert(abs(a[i]-a[i-1]));
                s.insert(abs(a[i+1]-a[i]));
                era(abs(a[i+1]-a[i-1]));
            }
            era(abs(a[2]-a[1]));
            ans+=*s.begin();
            s.insert(abs(a[2]-a[1]));
            era(abs(a[n]-a[n-1]));
            ans+=*s.begin();
            printf("%I64d",ans);
        } 
    }

    最后image

    f**k y*u

    后来冷静想了下,好像是个傻逼题

    求出前ii个数里相邻差值的最大值f_i,ii到nn里相邻差值的最大值g_i,那么ans=sum_{i=1}^nmax(|A_{i-1}-A_{i+1}|,f_{i-1},g_{i+1})

    int f[200005],g[200005],a[200005];
    int main(){
        int T=gi;
        while(T--){
            int n=gi;
            FOR1(i,n)a[i]=gi;
            for(int i=2;i<=n;i++)f[i]=max(f[i-1],abs(a[i]-a[i-1]));
            for(int i=n-1;i>=1;i--)g[i]=max(g[i+1],abs(a[i+1]-a[i]));
            //FOR1(i,n-1)printf("%d ",f[i]);puts("");
            ll ans=0;
            FOR1(i,n){
                if(i==1)ans+=g[2];//printf("%I64d
    ",ans);
                else if(i==n)ans+=f[n-1];//printf("%I64d
    ",ans);
                else{
                    //printf("%d %d
    ",f[i-1],g[i+1]);
                    ans+=max(f[i-1],max(g[i+1],abs(a[i+1]-a[i-1])));
                    //printf("%I64d
    ",ans);
                }
            }
            printf("%I64d
    ",ans);
        }
    }

    1003

    【题意】

    给定一个和前两题差不多长的序列,给定一组m,k的值,求多少个区间里的第 k 大的数不小于 m

    【题解】

    xjb尺取一下就行了

    image

    int a[233333];
    int main(){
        int T=gi;
        while(T--){
            int n,m,k;
            n=gi;m=gi;k=gi;
            FOR1(i,n)a[i]=gi;
            int st=1,ed=0,cnt=0;ll ans=0;
            while(st<=n){
                while(cnt<k&&ed+1<=n)cnt+=(a[++ed]>=m);
                if(cnt==k)ans=ans+n-ed+1;
                cnt-=(a[st++]>=m);
            } 
            printf("%I64d
    ",ans);
        }
    }

    【SystemTest】

    1002果然T辣qwq

    由于手速慢一个人都没hack到

    image

    单调递减的排名=。=大沙茶的第一次BC到此结束。

  • 相关阅读:
    BZOJ 2434: [Noi2011]阿狸的打字机
    BZOJ 3640: JC的小苹果
    BZOJ 1444: [Jsoi2009]有趣的游戏
    BZOJ 4820: [Sdoi2017]硬币游戏
    BZOJ 3670: [Noi2014]动物园
    BZOJ 1009: [HNOI2008]GT考试
    BZOJ 3681: Arietta
    BZOJ 1941: [Sdoi2010]Hide and Seek
    BZOJ 4602: [Sdoi2016]齿轮
    BZOJ 3514: Codechef MARCH14 GERALD07加强版
  • 原文地址:https://www.cnblogs.com/chouti/p/5746096.html
Copyright © 2011-2022 走看看