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\n",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