日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

11.13模拟:总结

發布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11.13模拟:总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 總結
  • 題目
  • update(solution of T3):
    • 代碼

230pts
100+100+30+0

總結

不要先入為主!如果某種算法受阻,要嘗試一下別的路子!!
本次的主要問題:

  • T2花費時間略長(指2h)
  • T3在錯誤的路上走了1h越走越偏,啥都沒推出來,最后只好暴力草草收尾
  • (在家里太久不用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=1j?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模拟:总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。