NOIP2018游记

noip2018即将到来,我这个pj蒟蒻又开始瑟瑟发抖了
10.10 窝拿到了万恶的初赛准考证
我觉得初赛过不去
立下flag:如果我初赛过了,就讲解珂朵莉树
初赛bless all
10.13(预定)初赛爆零,AFO 我才初二啊qaq,我不想退役
真·10.13 初赛好慌啊
回家对答案,估分考了95,真香
错了两道选择和问题求解的1分qaq
noip2018 复赛++rp,bless all
10.18分数钱出来
79分,稳了,但我好像之前立过flag???
10.19分数出来,比估分低两分(玄学)???
南京市第十五,假的
看来我要讲解珂朵莉树了qaq
10.20晚上我讲解了珂朵莉树(非直播)
玄学视频现场
看初赛前写的珂朵莉树没白写,rp爆棚
10.29颓废了半个月,竟然把超炮两季和魔禁两季+已经出的看完了(鬼知道我哪来的大会员)
11.1 聆听23forever dalao讲一些毒瘤题
11.3 惊人的ak了一场pj膜你赛,这或许会rp--
11.6还是听23forever大毒瘤讲提高组膜你题
好颓废啊qaq,我最近一直在颓约战

day -1 还是听23forever大毒瘤讲提高组膜你题

我这个pj蒟蒻只好默默刷水题

noip复赛bless all

day 0 才拿到准考证qaq

day 1

gg,估分300以下,时间掌控出了问题

试机时,我写了IO优化和线段树模板(根本没用到)

上个厕所

题目提前5min就发下来了,真是良心

先通读全卷,好毒瘤啊,我感觉我即将AFO

T1,主要是

    while((c=getchar())!=EOF)

T2,我以为爆long long,先用了unsigned long long

后来发现unsigned long long加上我的IO优化会出锅

所以改成long long,并加了一堆子数学手法使得long long不会在我心中爆炸

写了将近一百行

过了大样例,这是已经过去1个小时了qaq

回家后再也写不出那程序了qaq

但考场上最大值开的是1e18,太小了qaq,或许就80pts

很可能会爆long long ,10^6 * 10^6 * 10^9 很危险qaq

数据范围看错了qaq,10^910^510^5在long long范围内

T3一看就是个dp

可惜我调了2个小时

我写的dp的时间复杂度很玄学

考虑dp[i]表示到第i秒,最少要等多长时间(废话)

然后我们得出了方程 dp[j]=Min(dp[j],dp[i]+cost(i,j)) (0<=i<=j<=4*10^6)

cost(i,j)表示从i开始到j之间的人在第j秒上车总共要等多长时间

这个算法的复杂度大概是O(10^16),肯定不行

让我们考虑优化

易得出dp[j]=Min(dp[j],dp[i]+cost(i,j)) (0<=i<= 4 * 10^6,i+m<=j<i+ 2 * m)

自行脑补一下吧

这个算法的复杂度大概是O(10^11),还是很慢

我们能不能O(1)得出cost(i,j)呢?

答案是肯定的

我们可以考虑前缀和优化

我们可以求出从第1秒到第i秒上车所有人一共需要等timee[i]秒

我们还可以求出从第1秒到第i秒一共的人数sum[i]

所以cost(i,j)可O(1)求出

cost(i,j)=timee[j]-timee[i]-num[i]*(j-i)

dp[j]=Min(dp[j],dp[i]+timee[j]-timee[i]-num[i] * (j - i )) (0<=i<=4 * 10^6,i+m<=j<i+2 * m)

复杂度是O(10^8),ccf老爷机也许跑不过

我们还要继续考虑优化

发现n和m都很小

所以两个人之间很可能隔着十万八千里

如果按上述转移方程写的话,会造成大量时间损失,所以可以特判,直接跳过中间,把t[i]~t[i]+m-1的最小值赋值到t[i+1]

最后答案是dp[t[n]]~dp[t[n]]+m-1中最小值

复杂度大约是O(n m^2),比std快一点

我考场上的代码(十分乱qaq)

(实际这有可能是个假算法qaq,但对拍好像没有问题)

洛谷民间数据也过了

QQ20181111121036.png

#include <bits/stdc++.h>
#define M 4000005
using namespace std;
inline int read()
{
    register int x=0,f=1;register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return x*f;
}
inline void write(register int x)
{
    if(!x) putchar('0');if(x < 0) x = -x , putchar('-');
    static int sta[36];int tot=0;
    while(x)sta[tot++] = x % 10,x /= 10;
    while(tot)putchar(sta[--tot] + 48);
} 
inline int Min(register int a,register int b)
{
    return a<b?a:b;
}
int t[505];
int dp[M+500];
int num[M+500];
int timee[M+500];
int main()
{
    freopen("bus.in","r",stdin);
    freopen("bus.out","w",stdout);
    int n=read(),m=read();
    for(register int i=1;i<=n;++i)
        t[i]=read();
    sort(t+1,t+1+n);
    for(register int i=t[1],k=1;i<=t[n]+200;++i)
    {
        timee[i]=timee[i-1]+k-1;
        dp[i]=timee[i];
        while(t[k]==i)
            ++k;
        num[i]=k-1;
    }
    int k=1;
    for(register int i=t[1];i<=t[n];++i)
    {
        while(t[k]==i)
            ++k;
        if(t[k-1]+m-1==i&&t[k]-m>i)
        {
            int qaq=1e9;
            for(register int j=t[k-1];j<=t[k-1]+m-1;++j)
                qaq=Min(qaq,dp[j]);
            for(register int j=t[k]-m+1;j<=t[k];++j)
                dp[j]=qaq;
            i=t[k]-m+1;
        }
        for(register int j=i+m;j<i+2*m;++j)
            dp[j]=Min(dp[j],dp[i]+timee[j]-timee[i]-num[i]*(j-i));
    }
    int res=1e9;
    for(register int i=t[n];i<=t[n]+200;++i)
        res=Min(res,dp[i]);
    printf("%d\n",res);
    return 0;
 } 

防实名举报

233.png

2333.png

只剩半个小时了qaq

T4骗了个分,并检查了前面的程序

(听说T4比T3简单qaq?)

或许T3写的时候少出些锅T4就能写出来了qaq

T4马拉车加trie树?听说好像是哈希qaq

一看数据范围发现暴力能过qaq

我预计骗分能拿8pts

所以 100+84+100+8=292 qaq

NOIP2018就gg了qaq

11.12 期中考试原题赛
11.14 发现我好菜啊,要在省选前复习学习完所有主流算法
11.17 某网站测得100+100+100+12=312,或许是我珂朵莉树写太多的效果?
11.19 CCF咕咕咕了,说成绩到明天早上8点才出qaq
11.20 CCF成绩惊人的高qaq,100+100+100+24=324 qaq?
T4我是纯骗分啊qaq,就是输出样例,除了样例输出点数qaq
11.23 T4能骗48分qaq,不存在的,输出3和样例
nfls有人把全省pj都按官方数据测了一下,我才jsrank8,如果T4骗48分的话,我就能jsrank2了qaq(我才这一点分都排前十,可见毒瘤都去tg了qaq)
12.1 还是324
12.4 成绩出来了,jsrank9,全国rank85,noip就这样水过了qaq
12.5 被要求参加jsoi2019冬眠营集训班qaq

转载于:https://www.cnblogs.com/yzhang-rp-inf/p/9769530.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值