沈阳集训day4

忧伤地吐槽&记录
没错,今天已经day5了,因为day4有点失败,没写,大概就是这么意思,t1写的正解,t2线段树,一个小时可以搞出来的结果非得去写第三题正解,还写挂了只得了十分,初三的大佬20行代码贪心得了八十,只是感到心累,t4单调栈也没写,才得了150/400,离大佬们的距离越来越远,上去讲了两道题的题解,t1竟然歪打正着把正解yy出来了,一个大佬表示早就知道这种算法,我还以为这算法是我原创的,t3dp方程yy出来后,用单调队列搞,二分查找复杂度控制在nlogn,结果gyk大佬一句话就点出了其中一个致命错误,怪不得正解写挂,调了太久没发现这个错误,其实也只需要fenwick维护一下即可,总之该拿的分好多没拿,再加上前一天的100分扔掉,离大佬们的差距越来越远,感到深深绝望,出来的时候答应了各位大佬要发博客,所以还是发一下吧


试题

信息学奥赛校际联训
模拟测试 4 竞赛时间:2017 年 6 月 4 日 7:30-12:30
提交源程序须加后缀 对于 C++ 语言 prime.cpp hotel.cpp share.cpp holiday.cpp 对于 C 语言 prime.c hotel.c share.c holiday.c 对于 Pascal 语言 prime.pas hotel.pas share.pas holiday.pas
注意:最终测试时,所有编译命令均不打开任何优化开关。
题目名称 质数统计 旅馆 均分 假期 英文名称 prime hotel share holiday 目录 prime hotel share holiday 可执行文件名 prime hotel share holiday 输入文件名 prime.in hotel.in share.in holiday .in 输出文件名 prime.out hotel.out share.out holiday .out 每个测试点时限 1 秒 1 秒 1 秒 1 秒 内存限制 256 MB 256 MB 256 MB 256 MB 试题总分 100 100 100 100 测试点数目 20 10 10 10 每个测试点分值 5 10 10 10 是否有部分分 否 否 否 否 题目类型 传统型 传统型 传统型 传统型
信息学奥赛校际联训
第 2 页 共 7 页


质数统计(prime)

【问题描述】
TOM 喜欢研究各类质数问题,有一天他用人脑生成了[L,R][L,R]的所有质 数,但他的记忆力不太好,以至于忘记了生成了多少个质数,你的任务就是帮他 统计他一共生成了多少个质数。
【输入格式】
从文件 prime.in 中输入数据。
输入第一行包含一个正整数 T,表示数据组数。
接下来 T 行。
每行两个整数 L,R 分别表示你需要的统计的区间大小。
【输出格式】
输出到文件 prime.out 中。
输出仅包含 T 行,每行一个整数,为最终答案。
【样例输入】
2 1 10 55 77
【样例输出】
4 5
【数据规模与约定】
对于 30%的数据,1≤L,R≤103。
对于 60%的数据,1≤L,R≤106,R−L≤1000。
对于 100%的数据,1≤L,R≤109,R−L≤1000000,T≤10。
信息学奥赛校际联训
第 3 页 共 7 页


旅馆(hotel)

【问题描述】
OIER 们最近的旅游计划,是到长春净月潭,享受那里的湖光山色,以及明 媚的阳光。你作为整个旅游的策划者和负责人,选择在潭边的一家著名的旅馆住 宿。这个巨大的旅馆一共有 N (1 <= N <= 50000)间客房,它们在同一层楼中顺次 一字排开,在任何一个房间里,只需要拉开窗帘,就能见到波光粼粼的潭面。 所有的旅游者,都是一批批地来到旅馆的服务台,希望能订到 Di (1 <= Di <= N)间连续的房间。服务台的接待工作也很简单:如果存在 r 满足编号为 r..r+Di-1 的房间均空着,他就将这一批顾客安排到这些房间入住;如果没有满足条件的 r, 他会道歉说没有足够的空房间,请顾客们另找一家宾馆。如果有多个满足条件的 r,服务员会选择其中最小的一个。 旅馆中的退房服务也是批量进行的。每一个退房请求由 2 个数字 Xi、Di 描 述,表示编号为 Xi..Xi+Di-1 (1 <= Xi <= N-Di+1)房间中的客人全部离开。退房前, 请求退掉的房间中的一些,甚至是所有,可能本来就无人入住。 你的工作,就是写一个程序,帮服务员为旅客安排房间。你的程序一共需要 处理 M (1 <= M <=50000)个按输入次序到来的住店或退房的请求。第一个请求到 来前,旅店中所有房间都是空闲的。
【输入格式】
从文件 hotel.in 中输入数据。
第 1 行: 2 个用空格隔开的整数:N、M 第 2..M+1 行: 第 i+1 描述了第 i 个请求,如果它是一个订房请求,则用 2 个 数字 1、Di 描述,数字间用空格隔开;如果它是一个退房请求,用 3 个以空格隔 开的数字 2、Xi、Di 描述。
【输出格式】
输出到文件 hotel.out 中。
第 1..??行: 对于每个订房请求,输出 1 个独占 1 行的数字:如果请求能被 满足,输出满足条件的最小的 r;如果请求无法被满足,输出 0。
【样例输入】
10 6 1 3 1 3 1 3
信息学奥赛校际联训
第 4 页 共 7 页
1 3 2 5 5 1 6
【样例输出】
1 4 7 0 5
【数据规模与约定】
对于 20%的数据, 1<=N<=100,1<=M<=200
对于 100%的数据,1 <= N <= 50000 ,1 <= M <= 50000,数据有梯度。
信息学奥赛校际联训
第 5 页 共 7 页


均分(share)

【问题描述】
OIER 们都喜欢打电脑游戏,但每个人玩游戏的能力上也存在着巨大的差距。
OIER 们被分成两个游戏战队,处于公平考虑,要尽量使这个分配方案平均。那
么,在分配前,你要计算出分配方案中,两个战队游戏能力的最小的差距是多少。
【输入格式】
从文件 share.in 中输入数据。
第一行:一个数字 T,表示有 T 组测试点。
对于每个测试点
第一行是一个整数 n,代表 OIER 的总数。 第二行若干个正整数 ai,分别 代表每个 OIER 的游戏战力。
【输出格式】
输出到文件 share.out 中。
T 行,每行一个整数,为两个战队游戏能力的最小的差距
【样例输入】
2
4
1 2 3 4
3
1 2 4
【样例输出】
0
1
信息学奥赛校际联训
第 6 页 共 7 页
【数据规模与约定】
对于 10%的数据,n≤15 对于 30%的数据, n≤1000,∑ai≤105
对于 50%的数据,n≤100,000 对于 100%的数据,n≤106,∑ai≤106,T≤3
信息学奥赛校际联训
第 7 页 共 7 页


假期(holiday)

【问题描述】
OIER 们经过了几个月努力的学习,教练决定让 OIER 们放假。假期可以在 1…N 天内任意选择一段(需要连续),每一天都有一个享受指数 W。但是 OIER 们的要求非常苛刻,假期不能短于 P 天,否则 OIER 们不能得到足够的休息; 假期也不能超过 Q 天,否则 OIER 就会有荒废学业的危险。我们想知道 OIER 们能获得的最大享受指数。
【输入格式】
从文件 holiday.in 中输入数据。
第一行:N,P,Q. 第二行:N 个数字,中间用一个空格隔开。
【输出格式】
输出到文件 holiday.out 中。
一个整数,OIER 们能获得的最大享受指数。
【样例输入】
5 2 4 -9 -4 -3 8 -6
【样例输出】
5
【数据规模与约定】
对于 50%的数据,1=

#include 
#include 
#include
#include 
#define maxn 1000000+10
bool inp[maxn];
using namespace std;
int l,r,T;
int cnt(int L, int R){
    int i,j;
    int size=R-L+1;
    for (i=0;ifalse;
    if(L%2==1) i=1;
    else i=0;
    for (;i2)inp[i]=true;
    for (i=3;i<=sqrt(R);i+=2){
        if(i>L&&inp[i-L]) continue;
        j=(L/i)*i;
        if (jif (j==i)j+=i;
        j=j-L;
        for(;jtrue;
    }
    if(L<=1)inp[1-L]=1;
    if(L<=2)inp[2-L]=0;
    int num=0;
    for(i=0;iif(!inp[i]) num++;
    return num;
}
int main(){
    freopen("prime.in","r",stdin);
    freopen("prime.out","w",stdout); 
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&l,&r);
        printf("%d\n",cnt(l,r));
    }
    return 0;
}

t3写挂的数据结构优化dp

#include
#include
#include
#include
#define MAXN 1000000+10
using namespace std;
int a[MAXN],dp[MAXN],q[MAXN],cnt[MAXN],head,tail,T,n;
inline int readin()
{
    int x=0,f=1; char ch=0;
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-') f=-1,ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int find(int l,int r,double num){
    if(l==r) return l;
    int mid=l+r>>1;
    if((double)dp[q[mid]]>num*1.0) return find(l,mid,num);
    else return find(mid+1,r,num);
}
int main(){
    freopen("share.txt","r",stdin);
    //freopen("share.out","w",stdout);
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        head=1;tail=0;
        for(register int i=1;i<=n;i++) a[i]=readin();
        sort(a+1,a+n+1);//序列有序化
        for(register int i=1;i<=n;i++) cnt[i]=cnt[i-1]+a[i];
        dp[0]=0;
        q[++tail]=0;
        for(register int i=1;i<=n;i++){
            int loc=find(1,tail,double((double)cnt[i]/2-a[i])*1.0);
            dp[i]=dp[q[loc]]+a[i];
            while(dp[q[tail]]>dp[i])tail--;
            q[++tail]=i;
        }
        printf("%d\n",dp[n]-(cnt[n]-dp[n])); 
    }
    return 0;
}

t4的暴力

#include
#include
#include
#define MAXN 1000000
#define MINN 100
using namespace std;
int a[MAXN];
int maxn=-100000000;
int cnt[MAXN],N,P,Q;
inline int readin()
{
    int x=0,f=1; char ch=0;
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-') f=-1,ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main(){
    freopen("holiday.in","r",stdin);
    freopen("holiday.out","w",stdout);
    scanf("%d%d%d",&N,&P,&Q);
    for(register int i=1;i<=N;i++) a[i]=readin(),cnt[i]=cnt[i-1]+a[i];
    for(register int i=P;i<=Q;i++){
        for(register int j=1;j+i<=N;j++){
            maxn=max(maxn,cnt[j+i]-cnt[j]);
        }
    }
    printf("%d",maxn);
    return 0;
} 

如果有需要正解的朋友请联系qq2632812444

你可能感兴趣的:(沈阳集训)