noip模擬30 毛一琛 毛二琛 毛三琛

2022-09-09 15:00:23 字數 3411 閱讀 1265

咕了好久了,來更一篇(

這場比賽可以說吸取了之前的教訓,但沒有吸取完。

考場上順序開題。

\(\mathrm\mathbb\):狀壓

\(\mathrm\mathbb\):不知道

\(\mathrm\mathbb\):不知道

可以說毫無頭緒 \(\color(\)

別人:研究 \(\mathrm\rightarrow\) 拿到高分

研究 \(\mathrm\rightarrow\) 拿到高分

研究 \(\mathrm\rightarrow\) 拿到高分

或者是:

研究 \(\mathrm\rightarrow\) 研究 \(\mathrm\rightarrow\) 研究 \(\mathrm\rightarrow\) 拿到高分

我:研究 \(\mathrm}\rightarrow\) 反覆橫跳 \(\rightarrow\) 時間不足 \(\rightarrow\) 一通亂搞 \(\rightarrow\) 搞成低分

主要是在一直考慮 \(\mathrm\) 的優化和 \(\mathrm\) 的假做法。

這種狀況持續了兩個小時(

最後的乙個小時:按照 \(\mathrm}\) 的順序寫暴力。

估分:\(20+0+40=\color60\)

實際:\(15+0+40=55\)

還是說正解吧(

考場上只想到了 \(o(3^n)\) 的列舉相等子集的做法,一直在想優化,但沒想出來。

正解

\(\mathrm\ \mathrm\ \mathrm\ \mathrm\)

考慮把原來長度為 \(n\) 的序列分為兩個長度為 \(\frac\) 的序列,先算一邊,用乙個 \(\mathrm\),以兩個子集的差為下標,把更新的狀態全存進去。

再算另一邊,進行相同的操作,只不過不用存進去,把相同差的所有(前半的)狀態與列舉到的當前的(後半的)狀態或出最終的合法的狀態,用乙個 \(vis\) 陣列進行判斷是否合法。

最終只需統計有多少個狀態 \(i\) 使得 \(vis_i=1\)

時間複雜度為 \(o(6^}\color)\)

code

#includeusing namespace std;

const int n=21;

int n;

int a[n],sum[(1<<(n-1))+5],lg[(1<<(n-1))+5];

bool vis[(1<<(n-1))+5];

int ans;

map>q;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int main()

} for(int i=0;i<=base-1;i++) }

for(int i=0;i<=limit;i+=base) }

for(int i=0;i<=base-1;i++)

}} for(int i=1;i<=limit;i++) ans+=vis[i];

printf("%d\n",ans);

return 0;

}

考場上想的是先求出一種合法的 \(q\),再從這個 \(q\) 去拓展其它合法的 \(q\),結果這個做法被a神叉掉了。

正解

定義 \(cmp_i\) 為在序列 \(q\) 中第 \(i\) 位與第 \(i+1\) 位 \(\mathrm\) 的先後順序,對於乙個數,如果想回到原來的位置的話,從當前這個位置到原本的位置這一段區間,在序列 \(q\) 上的順序就已經固定了。

求 \(cmp\) 的方法可以用乙個右指標 \(r\),初始 \(r=n-1\),每次在 \([1,r]\) 中尋找 \(\max\) 然後計算 \(cmp\) 從 \(\max\) 到 \(r\) 的值,最後 \(o(n^2)\ \mathrm\) 即可。

記得處理邊界。

設 \(f_\) 表示 \(i\) 在前 \(i\) 個數中排名為 \(j\) 的方案數,則有:

\(f_=\begin

\displaystyle\sum_^f_&\text\ cmp_=\color1\\

\displaystyle\sum_^f_&\text\ cmp_=0

\end\\\)

字首和維護即可做到 \(o(n^\color2)\) 的時間複雜度。

另一種求 \(cmp\) 陣列的方法可以見dalao的部落格

code

#includeusing namespace std;

const int n=5005,mod=1e9+7;

int n,mx,id;

int p[n],cmp[n];

int f[n][n],sum[n][n];

long long ans;

int main()

int r=n-1;

while(r>=1)

f[1][1]=sum[1][1]=1;

for(int i=2;i<=n-1;i++)

for(int j=1;j<=i;j++) sum[i][j]=(sum[i][j-1]+f[i][j])%mod;

} cout《正常的列舉加二分,複雜度為 \(o(np\log np)\)

正解

在二分的基礎上加上隨機化,去掉列舉 \(x\) 的部分,改成用 \(\mathrm\) 來隨機化的選取 \(x\),如果當前 \(x\) 可以使得 \(ans\) 更優,再進行二分,否則直接 \(continue\),乙個隨機排列中比前面所有數都大的數的數量期望為 \(\log\)(感性理解),因此複雜度為\(o(np+n\log n\log p)\)

code

#includeusing namespace std;

const int n=10005;

int n,p,k;

int a[n],b[n],c[n];

int ans=0x3f3f3f3f;

bool check(int x)

if(cnt<=k) return 1;

return 0;

}int main()

{ srand(time(0));

cin>>n>>p>>k;

for(int i=1;i<=n;i++) cin>>a[i];

for(int i=0;i<=p-1;i++) c[i]=i;

random_shuffle(c,c+p);

for(int j=0;j<=p-1;j++)

{ int x=c[j];

for(int i=1;i<=n;i++) b[i]=(a[i]+x)%p;

if(check(ans)==0) continue;

int l=0,r=p*n;

while(l

如何惹毛一名開發者?

論讓開發者不開心的二三事。作者 nicklas millard 譯者 香檳超新星 責編 屠敏 出品 csdn id csdnnews 老實說,想要惹毛一名開發者很容易。有時候,一件不起眼的小事情也可能會觸發程式設計師敏感的神經。個性越鮮明的開發者,越容易炸毛。在我看來,開發者 程式設計師和工程師人群...

一旦惹毛了就很難哄好的星座們!

生活中,和別人吵架鬧矛盾或許在所難免,但是鬧矛盾也得考慮後果,否則就很容易導致自己難以承受的後果。因此,有的人懂得忍讓和包容,而有的人卻顯得較為極端。讓我們看看十二星座中那些一旦和他鬧翻或者關係鬧僵了,就別想再修復或者和好的幾大星座吧 雙子座人可以對你真誠相待,但是相處不愉快的時候也一定會主動離開。...

考試反思 0825NOIP模擬測試30 沒落

ab卷,15人。lrefrain rank 1179 skyh rank 2122 116108 5442雖說還是不怎麼樣,但是有好轉的跡象。開卷審題,t1是個 假 期望,感覺也許還可做。t2是個回文?回文自動機根本沒打題,會死的吧。不可做 t3題目名字倒好看,對於沒有仇恨的顯然可以簡單樹p,其他的...