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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

AtCoderGC038B - Sorting a Segment 数据结构 + RMQ

發布時間:2025/3/11 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AtCoderGC038B - Sorting a Segment 数据结构 + RMQ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給定一個長度為N的排列,你只能對其中長度為K的連續子序列進行一次從小到大的排序,問:排序之后能形成多少不同的排列?

數據范圍: 1 <= n, k <= 200,000, k <= n.

-----------------------------------分割線--------------------------------

分析此題,我們發現,長度為K的連續子序列在原排列中只有 N-K+1個,也就是說只會有N-K+1個排序情況,得出答案的上界N-K+1.

考慮上界中有多少連續子序列重復計數M,減去M即為答案。

那么剩下的問題就是統計每一個排序之后的連續子序列相同的個數M了。

樸素做法:枚舉每一個長度為K的區間,對區間內從小到大排一下序,得出原排列,與其他排列進行比較,統計相同排列的個數cnt,累加每個cnt-1即可。

時間復雜度? O(N^2*Klog(K)).

思考一下優化方法。

設原排列為A1,A2,A3,........,An。

假設一個區間[l,r]排序之后為原排列為P(l,r).

那么如果P(l1,r1) = P(l2,r2)且 r1 - l1 +1 = r2 - l2 + 1 = K。

當且僅當存在以下兩種情況,上式成立:

(1) 區間[l1,r1] 和 區間[l2,r2] 原本就從小到大有序。

(2)?區間[l1,r1] 和 區間[l2,r2]相鄰,即 l2 = l1+1,r2 = r1+1,且 min[l1,r2] = a[l1],max[l1,r2] = a[r2].?

結論(1)的正確性顯然。

主要討論結論(2)的正確性:

我們可以知道,區間[l1,r1] 和 區間[l2, r2] 的區間交為[l2,r1],區間并為[l1,r2]。

如果只考慮區間[l2,r1],那么排序結果顯然相同。

而P(l1,r1) <=> P(l2,r1)U 由區間[l1,l2-1]中所有元素基于大小關系插入區間[l2,r1]的相應位置。

區間[l2,r2] 同理。

于是我們只需解決區間[l1,l2-1] 和區間 [r1+1,r2]對區間[l2,r1]的 排序影響。

如果[l1,r1] 與 [l2,r2] 不相鄰,且非情況(1),則 P(l1,r1) != P(l2,r1),P(l2,r2)!= P(l2,r1),P(l1,r1)!= P(l2,r1)!= P(l2,r2),不存在。

則當l2 = l1+1 時,若min[l1,r2] = a[l1],則P(l1,r1)= P(l2,r1),若max[l1,r2] = a[r2],則P(l2,r2)= P(l2,r1).由傳遞性可知:P(l1,r1)= P(l2,r1)= P(l2,r2)。結論成立。

證畢。

于是根據這兩個結論,我們可以首先求出情況(1)的重復數,掃一遍原排列,求出長度大于等于K的升序區間數量。

對于情況(2),我們先選取區間[1,K],維護最大值和最小值,接著左端點和右端點指針分別往右移,轉移到區間[2,K+1],對于區間[1,K]和[2,K+1],判斷是否符合min[1,K+1] = a[1] 并且 max[1,K+1] = a[K+1].若符合,則累加到M中,否則繼續往右移,直到右端點到N為止。

維護動態區間最大值和最小值可以用STL的堆 或者 set 維護。

插入刪除復雜度O(logN),遍歷時間復雜度O(N),總時間復雜度O(NlogN).可以通過。

其實還可以用單調隊列維護,總時間復雜度降為O(N),大家有興趣可以嘗試一下(我就不試了QAQ).

堆的代碼如下:

#include<bits/stdc++.h>#define ll long long #define mp make_pair #define rep(i, a, b) for(int i = (a);i <= (b);i++) #define per(i, a, b) for(int i = (a);i >= (b);i--)using namespace std;typedef pair<int, int> pii; typedef double db; const int N = 1e6 + 50; int n, k, a[N], cnt = 0, flag = 0; int ans = 0, maxx, minn, pmax, pmin; int vis[N], f[N]; priority_queue < int, vector<int>, greater<int> > q; priority_queue < int, vector<int>, less<int> > p; inline int read(){int x = 0, f = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') f = -1; ch = getchar();}while(ch >='0' && ch <='9'){x = (x<<3)+(x<<1)+(ch^48); ch = getchar();}return x*f; } void init(){n = read(); k = read(); rep(i, 1, n) a[i] = read();rep(i, 1, k) p.push(a[i]), q.push(a[i]);rep(i, 2, n){if(a[i] > a[i-1]){int sum = 0;while(a[i] > a[i-1] && i <= n) i++, sum++;if(sum >= k-1) cnt ++;}}ans = n-k+1;int l = 1, r = k;while(r <= n){r++;if(r > n) break;while(vis[q.top()]) q.pop(); while(f[p.top()]) p.pop();if(a[l] == q.top() && a[r] > p.top()){q.pop(); p.push(a[r]);q.push(a[r]);f[a[l]] = 1;ans --;}else if(a[l] == q.top() && a[r] < p.top()){q.pop(); p.push(a[r]);q.push(a[r]);f[a[l]] = 1;}else if(a[l] == p.top()){p.pop(); p.push(a[r]);q.push(a[r]);vis[a[l]] = 1;}else if(a[l] != q.top() && a[l] != p.top()){p.push(a[r]); q.push(a[r]);f[a[l]] = 1, vis[a[l]] = 1;}l++;}if(!cnt) printf("%d\n", ans);else printf("%d\n", ans - cnt+1); } int main(){init();return 0; } View Code

STL的<set>代碼如下:

#include<bits/stdc++.h>#define ll long long #define mp make_pair #define rep(i, a, b) for(int i = (a);i <= (b);i++) #define per(i, a, b) for(int i = (a);i >= (b);i--)using namespace std;typedef pair<int, int> pii; typedef double db; const int N = 1e6 + 50; int n, k, a[N], ans = 0, cnt; set <int> s; set <int>::iterator it; inline int read(){int x = 0, f = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') f = -1; ch = getchar();}while(ch >='0' && ch <='9'){x = (x<<3)+(x<<1)+(ch^48); ch = getchar();}return x*f; } void init(){n = read(); k = read();rep(i, 1, n) a[i] = read();rep(i, 1, k) s.insert(a[i]);rep(i, 2, n){if(a[i] > a[i-1]){int sum = 0;while(a[i] > a[i-1] && i <= n) i++, sum++;if(sum >= k-1) cnt ++;}}ans = n-k+1;int l = 1, r = k;while(l <= r && r <= n){r++;if(r > n) break;s.insert(a[r]);if(*(s.rbegin()) == a[r] && (*s.begin()) == a[l]) ans --;s.erase(a[l]); l++;}if(!cnt) printf("%d\n", ans);else printf("%d\n", ans - cnt+1); } int main(){init();return 0; } View Code

?備注:本題堆的速度比<set>要快,但是代碼實現難度更大,推薦用<set>.

轉載于:https://www.cnblogs.com/smilke/p/11567189.html

總結

以上是生活随笔為你收集整理的AtCoderGC038B - Sorting a Segment 数据结构 + RMQ的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲第一区视频 | 99久久精品免费看国产免费软件 | 性高潮久久久久久久久 | 天堂久久一区 | 欧美射射射 | 国产av无码专区亚洲a∨毛片 | 日韩精品一区二区在线 | 在线观看一区二区视频 | 校园春色自拍偷拍 | 久久精品屋 | 黄色理论片 | 精品无码一区二区三区爱欲 | 69xav| 国产人妻777人伦精品hd | 天天激情站 | 免费观看美女裸体网站 | 青青久久av北条麻妃黑人 | 波多野结衣在线免费视频 | 3344成人 | 国产亚洲欧美日韩高清 | 黄色成人av | 九九爱视频| 91一区二区视频 | 三级全黄做爰在线观看 | 九热这里只有精品 | 国产粉嫩呻吟一区二区三区 | 欧美视频xxx | 亚洲码欧美码一区二区三区 | 日韩欧美爱爱 | 蜜臀av一区二区三区有限公司 | 午夜精品久久久久久久久久久久 | 天堂成人av | 香蕉久久一区二区三区 | 巨乳女教师的诱惑 | 伦理片一区二区 | 成人在线视频观看 | 香蕉久热 | 亚洲三级网 | 免费一级淫片 | 国内外成人免费视频 | 欧美啪啪网 | 亚洲片国产一区一级在线观看 | av色播 | 欧美一级大黄 | 久久99热久久99精品 | 青青伊人国产 | 天天做夜夜爽 | 欧美一区视频 | 91国内产香蕉 | 国产白丝精品91爽爽久久 | 中文字幕手机在线视频 | 一级片久久 | 日韩国产欧美一区二区三区 | 六月综合| 欧美日韩在线视频免费 | 久久视频在线看 | 天天躁日日躁狠狠躁伊人 | 偷偷在线观看免费高清av | 伊人网视频在线观看 | 久一精品| 中文字幕第七页 | 黑人巨大精品欧美黑白配亚洲 | 亚洲蜜臀av乱码久久精品蜜桃 | 午夜剧场免费在线观看 | 天天插综合网 | 免费a网 | 欧美精品18 | 国产婷婷一区二区三区 | 日本一卡二卡在线 | 欧美成人一区二免费视频软件 | 日韩欧美一区二区视频 | 日本欧美在线 | 天天爽夜夜爽夜夜爽 | 香蕉视频91| 播播激情网 | 成人免费网站在线 | 国产美女永久免费无遮挡 | 久久成人福利视频 | 国产免费一区二区三区四区五区 | 爱啪啪网站 | 亚洲综合精品国产 | 都市激情校园春色 | 国产精品成人自拍 | 污污av| 色综合区| 欧美人妻精品一区二区免费看 | 免费看黄色的网站 | 97久久国产| 国产一区二区小说 | 九九小视频 | av2014天堂| 国产另类专区 | 日韩中文av在线 | 亚洲天堂999 | 亚洲日本va中文字幕 | 日本免费高清一区二区 | 国产成人亚洲精品自产在线 | www.三级| 在线观看国产精品视频 |