POJ3264 - Balanced Lineup(세그먼트 트리 기본)
: POJ3264 - Balanced Lineup
사고의 방향
이 문제는 트리 노드를 다음과 같이 설정하는 세그먼트 트리의 기본 적용입니다.
struct Node
{
int l, r; //
int ls, rs; // ,
int maxn, minn; //
}
코드
#include
#include
#include
using namespace std;
struct tNode
{
int l, r;
int ls, rs;
int maxn, minn;
}tree[400100];
int nCount = 1;
int num[200100];
void build(int root, int l, int r)
{
if(l==r)
{
// 1
tree[root].maxn = tree[root].minn = num[l];
tree[root].l = tree[root].r = l;
}
else
{
//
tree[root].l = l;
tree[root].r = r;
//
int ls = tree[root].ls = ++nCount;
int rs = tree[root].rs = ++nCount;
// build
build(ls, l, (l+r)/2);
build(rs, (l+r)/2+1, r);
// ,
tree[root].maxn = max(tree[ls].maxn, tree[rs].maxn);
tree[root].minn = min(tree[ls].minn, tree[rs].minn);
}
}
void query(int root, int l, int r, pair<int, int> & ans)
{
if(tree[root].l==l&&tree[root].r==r)
{
//
ans.first = max(ans.first, tree[root].maxn);
ans.second = min(ans.second, tree[root].minn);
}
else if(l>=tree[tree[root].rs].l)
{
//
query(tree[root].rs, l, r, ans);
}
else if(r<=tree[tree[root].ls].r)
{
//
query(tree[root].ls, l, r, ans);
}
else
{
//
query(tree[root].ls, l, tree[tree[root].ls].r, ans);
query(tree[root].rs, tree[tree[root].rs].l, r, ans);
}
}
int main()
{
int n, q;
int l, s;
pair<int, int> ans; //
scanf("%d%d", &n, &q);
for(int i=1; i<=n; i++) scanf("%d", num+i);
build(1, 1, n);
for(int i=1; i<=q; i++)
{
scanf("%d%d", &l, &s);
ans = pair<int, int>(0, 0x7fffffff);
query(1, l, s, ans);
printf("%d
", ans.first-ans.second);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Codeforces Round #510 (Div. 2) D. Petya and Array 좌압과 세그먼트 트리문제는 바꿔 말하면, 구간 $[l, r)$의 부분합이 $t$ 미만의 부분합이 되는, $l,r$의 수를 요구하고 싶다. 즉, $a_0$에서 있는 $a_i$까지의 합을 index로, 출현 횟수를 값으로 하는 세그먼트 트...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.