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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

codeforces1454 F. Array Partition

發(fā)布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codeforces1454 F. Array Partition 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這周忙死,一直沒機會吧補一下題,周二晚上打的div3,過了A~E,F就看了下題目就沒時間了,無聊的時候想應該會用到ST表,然后想要維護指針,后來寫的時候發(fā)現(xiàn)維護不了,然后就歇菜了。。。

F. Array Partition

大佬題解
枚舉一個斷點,然后二分一個斷點。
三個區(qū)間分別為[1,i?1],[i,mid],[mid+1,n][1,i-1],[i,mid],[mid+1,n][1,i?1],[i,mid],[mid+1,n]

對于枚舉的端點iii顯然max(1,i?1)max(1,i-1)max(1,i?1)以固定,考慮如何確定midmidmid

  • min(i,mid)>max(1,i?1)min(i,mid)>max(1,i-1)min(i,mid)>max(1,i?1) 需要擴大中間的區(qū)間使min(i,mid)min(i,mid)min(i,mid)變小
  • min(i,mid)<max(1,i?1)min(i,mid)<max(1,i-1)min(i,mid)<max(1,i?1) 需要縮小中間的區(qū)間使min(i,mid)min(i,mid)min(i,mid)變大
  • min(i,mid)=max(1,i?1)min(i,mid)=max(1,i-1)min(i,mid)=max(1,i?1)
    1.若min(i,mid)>max(mid+1,n)min(i,mid)>max(mid+1,n)min(i,mid)>max(mid+1,n) 需要縮小中間的區(qū)間
    2.若min(i,mid)<max(mid+1,n)min(i,mid)<max(mid+1,n)min(i,mid)<max(mid+1,n) 需要擴大中間的區(qū)間
    3.找到答案直接輸出
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int mod=998244353; const int N=200010; int n,a[N]; int STmn[N][19],STmx[N][19],lg[N]; void pre() {lg[1]=0;for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;for(int i=1;i<=n;i++) STmx[i][0]=STmn[i][0]=a[i];for(int j=1;j<=lg[n];j++)for(int i=1;i+(1<<j)-1<=n;i++){STmn[i][j]=min(STmn[i][j-1],STmn[i+(1<<j-1)][j-1]);STmx[i][j]=max(STmx[i][j-1],STmx[i+(1<<j-1)][j-1]);} } int qmin(int l,int r) {int len=lg[r-l+1];return min(STmn[l][len],STmn[r-(1<<len)+1][len]); } int qmax(int l,int r) {int len=lg[r-l+1];return max(STmx[l][len],STmx[r-(1<<len)+1][len]); } int main() {//IO;int T=1;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];pre();bool ok=0;for(int i=2;i<n;i++){if(ok) break;int l=i,r=n-1;while(l<=r){int mid=l+r>>1;if(qmin(i,mid)>qmax(1,i-1)) l=mid+1;else if(qmin(i,mid)<qmax(1,i-1)) r=mid-1;else{if(qmin(i,mid)>qmax(mid+1,n)) r=mid-1;else if(qmin(i,mid)<qmax(mid+1,n)) l=mid+1;else{ok=1;cout<<"YES\n";cout<<i-1<<' '<<mid-i+1<<' '<<n-mid<<'\n';break;}}}}if(!ok) cout<<"NO\n";}return 0; }

奇怪的二分~~不會啊!
要加油哦~

總結(jié)

以上是生活随笔為你收集整理的codeforces1454 F. Array Partition的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。