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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

牛客第二场 G.League of Legends-单调队列优化dp

發布時間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客第二场 G.League of Legends-单调队列优化dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://ac.nowcoder.com/acm/contest/11253/G

??

上面出題人給的題解:

思路基本差不多,這里主要說一下合并小區間的dp,

dp[i][j]代表前i個分成j組最大的時間max

我們首先將區間排好序,如果滿足a[k]>b[i]?,則有?

j都是由j-1轉移過來的,所以可以用滾動數組優化一維空間(不優化也能過吧);

每次更新的時候,我們都要尋找所以a[k]>b[i]值,因為b[i]其實是排序好的,我們可以用單調隊列來優化,然后對于每次轉移我們需要找最大的轉移,然后根據轉移公式,我們發現dp[i-1][j-1]+b[i]更大的那個是更優的,那我們可以根據單調性可以用隊尾彈出一下沒意愿存的點(如果前面的點dp[i-1][j-1]+b[i]比后面的點小,那就是沒意義的)。

代碼有注釋

#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <cstdlib> #include <list> #define INF 0x3f3f3f3f3f3f3f3f #define inf 0x3f3f3f3f #define FILL(a,b) (memset(a,b,sizeof(a))) #define lson rt<<1 #define rson rt<<1|1 #define lowbit(a) ((a)&-(a)) #define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0); #define fi first #define sc second #define pb push_back #define endl '\n' #define all(x) (x).begin(),(x).end() using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pii; int dx[8]= {-1,1,0,0,1,1,-1,-1},dy[8]= {0,0,1,-1,-1,1,-1,1}; const ll mod=998244353; const ll N =1e6+10; const ll M =250000; const double eps = 1e-4; //const double pi=acos(-1); ll re(){ll x;scanf("%lld",&x);return x;} ll qk(ll a,ll b){ll ans=1;while(b){if(b&1) ans=ans*a%mod;a=a*a%mod;b/=2;}return ans;} inline int read(){int sgn = 1; int sum = 0;char ch = getchar();while (ch < '0' || ch > '9') {if(ch == '-') sgn = -sgn;ch = getchar();}while ('0' <= ch && ch <= '9') {sum = sum*10+(ch-'0');ch = getchar();}return sgn*sum;}ll n,k; ll dp[2][5500]; pii a[5500]; ll sum[5500]; void sovle(){cin>>n>>k;for(ll i=1;i<=n;i++) cin>>a[i].fi>>a[i].sc;sort(a+1,a+1+n);vector<ll> big;ll cnt=0;vector<pii> b;for(ll i=1;i<=n;i++){while(b.size()&&b.back().sc>=a[i].sc){//處理大區間big.pb(b.back().sc-b.back().fi);b.pop_back();}b.pb(a[i]);}for(pii v:b){//小區間a[++cnt]=v;}sort(all(big),greater<ll>());for(ll i=0;i<big.size();i++){//大區間前綴和sum[i+1]=sum[i]+big[i];}ll m=big.size();n=cnt;FILL(dp,-inf);dp[0][0]=0;//初始化ll ans=0;for(ll i=1;i<=k;i++){deque<ll> q;FILL(dp[1],-inf);for(ll j=1;j<=n;j++){while(q.size()&&dp[0][q.back()-1]+a[q.back()].sc<dp[0][j-1]+a[j].sc){q.pop_back();}//單調隊列優化q.push_back(j);while(q.size()&&a[q[0]].sc<=a[j].fi) q.pop_front();//單調隊列優化dp[1][j]=dp[0][q[0]-1]+a[q[0]].sc-a[j].fi;//狀態轉移}swap(dp[0],dp[1]);//優化空間if(m>=k-i){ans=max(ans,dp[0][n]+sum[k-i]);}}cout<<ans<<endl; }int main() {iosint t=1;while(t--){sovle();}return 0; }

總結

以上是生活随笔為你收集整理的牛客第二场 G.League of Legends-单调队列优化dp的全部內容,希望文章能夠幫你解決所遇到的問題。

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