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,109*105*10^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

posted @ 2018-10-10 22:18  JSOI爆零珂学家yzhang  阅读(3789)  评论(11编辑  收藏  举报