咕了好久了,來更一篇(
這場比賽可以說吸取了之前的教訓,但沒有吸取完。
考場上順序開題。
\(\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,其他的...