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,但对拍好像没有问题)
洛谷民间数据也过了
#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
",res);
return 0;
}
防实名举报
只剩半个小时了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