| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
晒代码 离散化+线段树#include <iostream> //离散化+线段树
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MAXN 100010
#define INF 9999999
using namespace std;
struct tree
{
int begin, end, count;
tree *left, *right;
};
tree Tree[MAXN * 2];
int pos[MAXN];
int num[MAXN];
int p1, p2;
tree* CreateTree (int a, int b)
{
tree *node = &Tree[p1++];
node->begin = a;
node->end = b;
if (a == b)
{
node->count = num[a];
}
else
{
int mid = (a + b) / 2;
node->left = CreateTree (a, mid);
node->right = CreateTree (mid + 1, b);
node->count = MAX(node->left->count, node->right->count);
}
return node;
}
int Query (int a, int b, tree *tr)
{
if (a == tr->begin && b == tr->end)
{
return tr->count;
}
int mid = (tr->begin + tr->end) / 2;
if (b <= mid)
{
return Query (a, b, tr->left);
}
else if (a > mid)
{
return Query (a, b, tr->right);
}
else
{
int tmp1 = Query (a, mid, tr->left);
int tmp2 = Query (mid + 1, b, tr->right);
return MAX(tmp1, tmp2);
}
}
int Calc (int x)
{
int a = 1, b = p2, mid;
if (a == b)
{
return a;
}
else if (b - a == 1)
{
return (x < pos[b] ? a : b);
}
else
{
while (1)
{
mid = (a + b) / 2;
if (x >= pos[mid] && x < pos[mid + 1])
{
return mid;
}
else if (x < pos[mid])
{
b = mid - 1;
continue;
}
else
{
a = mid + 1;
continue;
}
}
}
}
int main()
{
int n, q, i, x, y;
int a, b, res;
int tmp = INF;
tree *root;
while (scanf("%d", &n) != EOF && n != 0)
{
scanf ("%d", &q);
p2 = 1;
for (i = 1; i <= n; i++) //离散化
{
scanf ("%d", &x);
if (x != tmp)
{
pos[p2] = i;
if (p2 > 1)
{
num[p2 - 1] = pos[p2] - pos[p2 - 1];
}
p2++;
tmp = x;
}
}
pos[p2--] = n + 1;
num[p2] = pos[p2 + 1] - pos[p2];
p1 = 0;
root = CreateTree (1, p2);
while (q--)
{
scanf ("%d%d", &x, &y);
a = Calc(x);
b = Calc(y);
if (a == b)
{
res = y - x + 1;
}
else
{
res = MAX (pos[a + 1] - x, y - pos[b] + 1);
if (b - a == 2)
{
res = MAX (res, num[a + 1]);
}
else if (b - a > 2)
{
tmp = Query (a + 1, b - 1, root);
res = MAX (res, tmp);
}
}
printf("%d\n", res);
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator