洛谷 P4933 大師

2022-06-03 07:42:09 字數 906 閱讀 5792

題面

(實名推薦:本題的出題人小哥哥打球暴帥哦!(apio/ctsc/wc的時候一起打過球w,而且大學在我隔壁喔) )

沒仔細看資料範圍的時候真是摸不著頭腦。。。還以為要 o(n^2) dp 爆錘。。

後來發現v<=20000,這能幹啥呢?

至少我的暴力是可以趁機跑過了2333,暴力如下:

我們列舉每一種公差,然後每一輪     先把所有 a[j]-a[i]=公差 的 i在圖中連一條到j的邊(i

這裡有一點疏忽,因為僅僅乙個數構成等差數列這種情況會在每一輪都被算一遍,而我們最後只需要算它一次。一種解決辦法是把每輪的答案-n,然後所有算完了之後再+n。

算一下這個暴力的複雜度,o(2*n^2*log(n) + n*v ),後面拓撲排序總邊數的 o(n^2)被前面更大的那個複雜度給按下去了,而那個複雜度是因為我懶得寫基數排序而多出來的,但因為本題 2*n^2*log(n) 與 n*v 在 n與v同時取到最大值的時候恰好相等,所以我就懶得優化這個玩意了hhhh

#include#define ll long long

using namespace std;

#define pb push_back

const int n=1005,ha=998244353;

inline int add(int x,int y)

inline void add(int &x,int y)

vectorg[n];

int f[n],n,h[n],num,ans,id[n];

struct node }}

inline void solve();

sort(a+1,a+num+1);

for(int i=1,j;i<=num;i=j)

add(ans,n);

}int main()

洛谷 P4933 大師(dp)

設dp i j 表示選出了第i個電塔,上乙個選出的是第j個電塔的方案數。列舉i,j,轉移方程為 找乙個k,使得h k h j h i 構成等差數列,並且kdp i j dp j k 對於確定的i,j,h k 是確定的,所以我們可以用vector a i 的高度為i的編號,k即為列舉a h k 裡的元...

洛谷 P4933 大師(DP)

方程的設計比較難想 設f i j 表示等差數列的最後乙個數的位置為i,公差為j的方案數。轉移的話 列舉k從1到i,f i j f k j 最後累加答案,注意ans i的含義 乙個及兩個的方案數 ac 1 include2 include3 using namespace std 4const int...

洛谷 P4933 大師 題解(dp)

設定 dp i j 表示以 i 結尾公差為 j 的等差數列個數 你可能會想為什麼是 i 結尾而不是開始呢,其實你會發現如果設以 i 開始根本不知道怎麼設狀態轉移方程 注意轉移方程要設定偏移量p,要不然陣列可能就會負數。所以陣列開大兩倍。還有要注意ans加的不是dp i a i a j p 因為可能後...