UVA 11235/HDU 1806/POJ 3368 Frequent values
2013-09-25 11:33
543 查看
RMQ.按非降序给出一列数,对于每个询问,回答区间内出现最多的数出现的次数。
先把数据压缩一下,记录每个数字出现的次数,开始以及结束位置。那么询问的区间L,R可以分为三部分:L所在区域,R所在区域,和中间。L所在区域:L到该区间右端点的距离。R所在区域:该区间左端点到R的距离。中间部分就是一个RMQ,求区间最值。当LR在同一区域时,直接算就行。
先把数据压缩一下,记录每个数字出现的次数,开始以及结束位置。那么询问的区间L,R可以分为三部分:L所在区域,R所在区域,和中间。L所在区域:L到该区间右端点的距离。R所在区域:该区间左端点到R的距离。中间部分就是一个RMQ,求区间最值。当LR在同一区域时,直接算就行。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<string> #include<queue> #include<cmath> ///LOOP #define REP(i, n) for(int i = 0; i < n; i++) #define FF(i, a, b) for(int i = a; i < b; i++) #define FFF(i, a, b) for(int i = a; i <= b; i++) #define FD(i, a, b) for(int i = a - 1; i >= b; i--) #define FDD(i, a, b) for(int i = a; i >= b; i--) ///INPUT #define RI(n) scanf("%d", &n) #define RII(n, m) scanf("%d%d", &n, &m) #define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k) #define RIV(n, m, k, p) scanf("%d%d%d%d", &n, &m, &k, &p) #define RV(n, m, k, p, q) scanf("%d%d%d%d%d", &n, &m, &k, &p, &q) #define RFI(n) scanf("%lf", &n) #define RFII(n, m) scanf("%lf%lf", &n, &m) #define RFIII(n, m, k) scanf("%lf%lf%lf", &n, &m, &k) #define RFIV(n, m, k, p) scanf("%lf%lf%lf%lf", &n, &m, &k, &p) #define RS(s) scanf("%s", s) ///OUTPUT #define PN printf("\n") #define PI(n) printf("%d\n", n) #define PIS(n) printf("%d ", n) #define PS(s) printf("%s\n", s) #define PSS(s) printf("%s ", s) #define PC(n) printf("Case %d: ", n) ///OTHER #define PB(x) push_back(x) #define CLR(a, b) memset(a, b, sizeof(a)) #define CPY(a, b) memcpy(a, b, sizeof(b)) #define display(A, n, m) {REP(i, n){REP(j, m)PIS(A[i][j]);PN;}} #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 using namespace std; typedef long long LL; typedef pair<int, int> P; const int MOD = 1e9+7; const int INFI = 1e9 * 2; const LL LINFI = 1e17; const double eps = 1e-6; const int N = 111111; const int M = N << 2; const int move[8][2] = {0, 1, 0, -1, 1, 0, -1, 0, 1, 1, 1, -1, -1, 1, -1, -1}; int num , begin , end , d [30], a , b ; void init(int k) { FFF(i, 1, k)d[i][0] = num[i]; for(int j = 1; (1 << j) <= k; j++) for(int i = 1; i + (1 << j) - 1 <= k; i++) d[i][j] = max(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]); } int rmq(int L, int R) { int k = 0; while(1 << (k + 1) <= R - L + 1)k++; return max(d[L][k], d[R - (1 << k) + 1][k]); } int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int n, m, k, x, y, p, q, ans; while(RI(n), n) { RI(m); k = 1; CLR(num, 0); FFF(i, 1, n) { RI(a[i]); if(!k || a[i] != a[i - 1]) { begin[k] = i; k++; } end[k - 1] = i; num[k - 1]++; b[i] = k - 1; } init(k - 1); while(m--) { RII(x, y); if(b[x] == b[y])PI(y - x + 1); else { p = end[b[x]]; q = begin[b[y]]; ans = max(p - x + 1, y - q + 1);; p = b[x] + 1; q = b[y] - 1; if(p <= q)ans = max(ans, rmq(p, q)); PI(ans); } } } return 0; }
相关文章推荐
- POJ 3368 Frequent values (UVA 11235)(RMQ)
- HDU 1806 && POJ 3368 Frequent values (RMQ)
- POJ 3368 && HDU 1806 Frequent values(ST)
- poj 3368 && hdu 1806 Frequent values(数据结构:RMQ)
- POJ 3368 & UVA 11235 - Frequent values
- POJ 3368—— Frequent values(频繁出现的数值UVA11235) RMQ
- [POJ] 3368 / [UVA] 11235 - Frequent values [ST算法]
- POJ 题目3368 ||HDOJ 题目1806 Frequent values(RMQ)
- UVa 11235 / POJ 3368 Frequent values (想法题&RMQ线段树维护最长区间长度)
- UVa 11235 Frequent Values
- UVA - 11235 Frequent values
- uva 11235 - Frequent values
- POJ 3368 Frequent values (基础RMQ)
- UVA 11235 - Frequent values (RMQ的应用)
- POJ 3368 Frequent values
- POJ 3368 Frequent Values(RMQ)
- poj 3368——Frequent values
- UVA 11235 Frequent values (RMQ )
- poj 3368 Frequent values
- POJ 3368 Frequent values(RMQ)