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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 1806 Frequent values 线段树

發(fā)布時(shí)間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 1806 Frequent values 线段树 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接

給一個(gè)非遞減數(shù)列, n個(gè)數(shù), m個(gè)詢問, 每個(gè)詢問給出區(qū)間[L, R], 求這個(gè)區(qū)間里面出現(xiàn)次數(shù)最多的數(shù)的次數(shù)。

非遞減數(shù)列, 這是最關(guān)鍵的一個(gè)條件...

需要保存一個(gè)區(qū)間最左邊的數(shù), 最右邊的數(shù), 最長前綴, 最長后綴, 和這個(gè)區(qū)間里面次數(shù)最多的數(shù)的次數(shù)。

一個(gè)區(qū)間出現(xiàn)最多的數(shù)的次數(shù), 應(yīng)該是左區(qū)間和右區(qū)間里面取一個(gè)最大值。 如果左區(qū)間最右邊的數(shù)和右區(qū)間最左邊的數(shù)相同, 還需要判斷這個(gè)數(shù)左右區(qū)間加起來的數(shù)量是否大于最大值。

合并的時(shí)候需要判斷左區(qū)間最右邊的數(shù)和右區(qū)間最左邊的數(shù)是否相同, 具體看代碼。

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define pb(x) push_back(x) 4 #define ll long long 5 #define mk(x, y) make_pair(x, y) 6 #define lson l, m, rt<<1 7 #define mem(a) memset(a, 0, sizeof(a)) 8 #define rson m+1, r, rt<<1|1 9 #define mem1(a) memset(a, -1, sizeof(a)) 10 #define mem2(a) memset(a, 0x3f, sizeof(a)) 11 #define rep(i, a, n) for(int i = a; i<n; i++) 12 #define ull unsigned long long 13 typedef pair<int, int> pll; 14 const double PI = acos(-1.0); 15 const double eps = 1e-8; 16 const int mod = 1e9+7; 17 const int inf = 1061109567; 18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; 19 const int maxn = 1e5+5; 20 int lnum[maxn<<2], rnum[maxn<<2], maxx[maxn<<2], pre_max[maxn<<2], suf_max[maxn<<2]; 21 void pushUp(int rt, int m) { 22 maxx[rt] = max(maxx[rt<<1], maxx[rt<<1|1]); 23 lnum[rt] = lnum[rt<<1]; 24 rnum[rt] = rnum[rt<<1|1]; 25 suf_max[rt] = suf_max[rt<<1|1]; 26 if(suf_max[rt] == (m>>1)&&lnum[rt<<1|1] == rnum[rt<<1]) //如果左區(qū)間最右邊的數(shù)和右區(qū)間最左邊的數(shù)相等 27 suf_max[rt] += suf_max[rt<<1]; //并且左區(qū)間的后綴長度等于這段區(qū)間的長度 28 pre_max[rt] = pre_max[rt<<1]; 29 if(pre_max[rt] == m-(m>>1) && rnum[rt<<1] == lnum[rt<<1|1]) 30 pre_max[rt] += pre_max[rt<<1|1]; 31 if(lnum[rt<<1|1] == rnum[rt<<1]) 32 maxx[rt] = max(maxx[rt], pre_max[rt<<1|1]+suf_max[rt<<1]); 33 } 34 void build(int l, int r, int rt) { 35 if(l == r) { 36 scanf("%d", &lnum[rt]); 37 rnum[rt] = lnum[rt]; 38 maxx[rt] = pre_max[rt] = suf_max[rt] = 1; 39 return ; 40 } 41 int m = l+r>>1; 42 build(lson); 43 build(rson); 44 pushUp(rt, r-l+1); 45 } 46 int query(int L, int R, int l, int r, int rt) { 47 if(L<=l&&R>=r) { 48 return maxx[rt]; 49 } 50 int m = l+r>>1; 51 if(R<=m) 52 return query(L, R, lson); 53 if(L>m) 54 return query(L, R, rson); 55 int tmp1 = query(L, m, lson); 56 int tmp2 = query(m+1, R, rson); 57 int tmp3 = 0; 58 if(lnum[rt<<1|1] == rnum[rt<<1]) 59 tmp3 = min(pre_max[rt<<1|1], R-m)+min(suf_max[rt<<1], m-L+1); 60 return max(tmp1, max(tmp2, tmp3)); 61 } 62 int main() 63 { 64 int n, m; 65 while(cin>>n&&n) { 66 cin>>m; 67 build(1, n, 1); 68 while(m--) { 69 int x, y; 70 scanf("%d%d", &x, &y); 71 printf("%d\n", query(x, y, 1, n, 1)); 72 } 73 } 74 return 0; 75 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/yohaha/p/5067773.html

總結(jié)

以上是生活随笔為你收集整理的hdu 1806 Frequent values 线段树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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