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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM