P4229 某位歌姬的故事 dp

2022-10-08 20:42:13 字數 1162 閱讀 9689

求有多少個長度為\(n\)的序列\(a\),滿足\(\forall i\in[1,n],a_i\in[1,a]\),還有\(q\)個限制形如

\[\max\(j\in[l_i,r_i])=m_i

\]\(1\leq n,a\leq 9\times 10^8,1\leq m_i\leq a,1\leq q\leq 500,1\leq t\leq 20\)

首先我們第一步肯定是把每個區間的端點提出來離散化,這樣我們的區間數就是\(o(q)\)級別的了。

然後考慮到對於兩個有交的區間\([l_1,r_1]\)限制為\(m_1\),\([l_2,r_2]\)限制為\(m_2\),在\(m_1時這兩個區間交的那一部分顯然不會對第二個區間產生影響,因為這個區間肯定合法並且不能是最大值。

那麼我們考慮求出每個區間能夠到達的最大值\(lim_i\),然後對乙個所有的限制\([l,r,w]\),我們都只需要考慮\(lim_i=w\)的區間。

現在相當於對於每個單獨的小區間我們可以選擇上到最大值或者沒有最大值。然後要求是每個區間至少有乙個最大值。

考慮\(dp\),設\(f_\)表示現在做到第\(i\)個區間,上乙個頂到最大值的區間是\(j\)時的方案,因為我們只處理\(lim_i=w\)的區間,所以乙個區間最多被做一次。

時間複雜度:\(o(tq^2)\)

#include#include#include#define ll long long

using namespace std;

const ll n=2100,p=998244353;

struct nodeq[n];

ll t,n,m,a,tot,cnt,b[n];

ll wc[n],bc[n],lim[n],len[n];

ll f[n][n],rim[n],loc[n],pos[n];

ll power(ll x,ll b)

return ans;

}bool cmp(node x,node y)

if(!flag)

} ll ans=1;

for(ll i=1;ill l,r=0;cnt--;

while(rprintf("%lld\n",ans);

return;

}signed main()

return 0;

}