【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:

然后写了个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);
    }
}

最后

f**k y*u

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

求出前ii个数里相邻差值的最大值,ii到nn里相邻差值的最大值,那么

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尺取一下就行了

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到

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

时间: 2024-08-26 07:38:51

【BC】BestCoder Round#86小结的相关文章

HDU 5806 NanoApe Loves Sequence Ⅱ(尺取+思维)——BestCoder Round #86 1003

传送门 NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Others)Total Submission(s): 514    Accepted Submission(s): 248 Problem Description NanoApe, the Retired Dog, has returned back to prepare for f

[HDU5807] [BestCoder Round #86 1004] Keep In Touch (DP)

[HDU5807] [BestCoder Round #86 1004] Keep In Touch (DP) 题面 有三个人从一张N个点无重边的有向无环图上的三个点出发,每单位时间,他们分别选择当前点的一条出边走下去.有向无环图点有点权,任意时刻他们所在的三个点两两点权相差不超过K.他们可以在任意三个点同时结束.求合法的路径总数.N≤50. 分析 暴力的做法,设\(dp[i][j][k]\)表示第一个人在i,第二个人在j,第三个人在k的方案数,然后枚举三个人接着到的地方x,y,z,倒推\(dp

BestCoder Round #86 A B C

这次BC终于不像上次一样惨烈 终于A了三题…… 终测ing…… 发一波题解…… A.Price List A题十分无脑 只要把所有数加起来存到sum里 询问的时候大于sum输出1 否则输出0就行了…… 犹豫了好久 怎么会这么简单…… 看群里好多人卡在了%I64d…… 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<s

HDU5808Price List Strike Back (BestCoder Round #86 E) cdq分治+背包

严格按题解写,看能不能形成sum,只需要分割当前sum怎么由两边组成就好 #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int N = 2e4+100; int f[N][105],g[N][105]

HDU5806 NanoApe Loves Sequence Ⅱ (BestCoder Round #86 C)二分

分析:大于等于m的变成1,否则变成0,预处理前缀和,枚举起点,找到第一个点前缀和大于m即可 找第一个点可以二分可以尺取 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long LL; const int N = 2e5+5; int T,n,m,k,a[N],sum[N]; int mai

HDU5804 Price List (BestCoder Round #86 A)水题

分析:大于总和输出1 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; const int N = 1e5+5; int ret[N],T,n,m; int main(){ scanf("%d",&T); while(T--){ scanf("%d%d",&n,&a

HDU5807 Keep In Touch (BestCoder Round #86 D ) 分布式dp

#include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> using namespace std; typedef long long LL; const int N = 50+2; const int mod = 998244353; int T,n,m,lim,q,tot,w[N],dp[N][N][N][3],he

BestCoder Round #86 1001

链接http://acm.hdu.edu.cn/showproblem.php?pid=5804 题意:给你一些商店和他的商品价格,然后给你一个记账本,问你记大了就是1,否则是0 解法:模拟,注意测试数据大小 #include<stdio.h> //#include<bits/stdc++.h> #include<string.h> #include<iostream> #include<math.h> #include<sstream&g

BestCoder Round #86 二,三题题解(尺取法)

第一题太水,跳过了. NanoApe Loves Sequence题目描述:退役狗 NanoApe 滚回去学文化课啦! 在数学课上,NanoApe 心痒痒又玩起了数列.他在纸上随便写了一个长度为 nnn 的数列,他又根据心情随便删了一个数,这样他得到了一个新的数列,然后他计算出了所有相邻两数的差的绝对值的最大值. 他当然知道这个最大值会随着他删了的数改变而改变,所以他想知道假如全部数被删除的概率是相等的话,差的绝对值的最大值的期望是多少. 输入描述 第一行为一个正整数 T,表示数据组数. 每组数