11.13模拟:总结
文章目錄
- 總結
- 題目
- update(solution of T3):
- 代碼
230pts
100+100+30+0
總結
不要先入為主!如果某種算法受阻,要嘗試一下別的路子!!
本次的主要問題:
(在家里太久不用linux,這次用用虛擬機
來回倒騰文件忒麻煩了qwq)
好的地方是沒有掛分吧
但考場上的表現還是不太滿意qwq
和上次時間“綽綽有余”恰恰相反
這次由于不少題看起來都挺可做,出現了時間嚴重不足的情況
T1文藝平衡樹板子連寫帶調加對拍,大概1h左右,還在可以接受的范圍內
然后就是通過打表死摳T2,又加對拍花了約2h(還好摳出來了)
T3寫了兩個假掉的dp設計然后越改越惡心,調了一個小時后只剩半小時,感覺無望,只好用map套vector轉了個暴力拿30,還好比較順利
此時只有15min左右了,T4甚至連暴力都已經沒時間了,草草寫下了一個固輸0…
但那個題就是寫暴力也很惡心,恐怕半小時也不一定能寫完
然后就是把文件倒騰到固定機上,打包提交了
題目
要增加對區間dp的敏感度!!
T1倒著想其實可以很方便的線性做出來,寫平衡樹有些大材小用了
T2確實是挺陰間的,這次敢不看題純打盲表找規律也是因為之前用類似的流氓方法艸過去了CF的一道題(但這個的規律更陰間一點),雖然花的時間有些長,但還算成功吧
T3考完和大家討論都提到區間dp,但我考場上一直想的是詭異的線性dp…雖然感覺也不容易,但應該會可做許多,又是先入為主的鍋了
T4容斥的大陰間題,事實是似乎T4幾乎沒有陽間題,即使是暴力的30也需要很復雜的狀壓dp,感覺雖然爆了0,但是損失不算太大
update(solution of T3):
寫一下T3的題解
思路很妙
考慮最后合法的方案
必定每個值的范圍是一段連續的區間,且前后順序和原序列相同,同時這個區間的原序列都大于這個值
設計dpi,jdp_{i,j}dpi,j?表示第 i 位與等于aja_jaj?的方案數
那么就有:
dpi,j=∑k=1jdpi?1,kdp_{i,j}=\sum_{k=1}^jdp_{i-1,k}dpi,j?=k=1∑j?dpi?1,k?
k必須小于j,否則j的區間就和k的區間逆序了
然后,如果i與j之間的最小值不是a[j],則dpi,j=0dp_{i,j}=0dpi,j?=0
上面的轉移用前綴和優化一下就可做到 n2n^2n2
代碼
#include<bits/stdc++.h> #include<cstdio> using namespace std; const int N=2050; const int mod=1e9+7; double eps=1e-10; #define ll long long ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();};return x*f; }int n,m; int a[N],mn[N]; ll dp[N][N],sum[N][N]; int main(){n=read();for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<=n;i++){mn[i]=a[i];for(int j=i+1;j<=n;j++) mn[j]=min(mn[j-1],a[j]);for(int j=i-1;j>=1;j--) mn[j]=min(mn[j+1],a[j]);for(int j=1;j<=n;j++){dp[i][j]=i==1?1:sum[i-1][j];if(mn[j]!=a[j]) dp[i][j]=0;}for(int j=1;j<=n;j++) sum[i][j]=(sum[i][j-1]+dp[i][j])%mod;}printf("%lld\n",sum[n][n]);return 0; } /* 1 9 9 19 99 63 39 72 46 97 38 68 0 6 4 0 7 1 0 3 6 */總結
以上是生活随笔為你收集整理的11.13模拟:总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF1408D:Searchlights
- 下一篇: 10岁儿童公主头扎法 简单的公主头怎么扎