[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}^n\max(|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\n",ans);
            else if(i==n)ans+=f[n-1];//printf("%I64d\n",ans);
            else{
                //printf("%d %d\n",f[i-1],g[i+1]);
                ans+=max(f[i-1],max(g[i+1],abs(a[i+1]-a[i-1])));
                //printf("%I64d\n",ans);
            }
        }
        printf("%I64d\n",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\n",ans);
    }
}

【SystemTest】

1002果然T辣qwq

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

image

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

posted @ 2016-08-07 14:29  zhouyis  阅读(165)  评论(0编辑  收藏  举报