문제 풀이 [luoguP 4145 하나님 이 문 제 를 만 드 신 7 분 2 (화신 이 각국 을 돌아 다 니 며)]
문제 풀이
구간 의 개방 과 구 조 를 지원 하 는 서열
알고리즘: 선분 트 리 는 개방 측 수정 과 구간 구 화 를 실현 합 니 다.
분석:
코드:
#include
#include
#include
#include
using namespace std;
typedef long long LL;
const int MAXN = 100100;
int n, m;
int cnt;
LL a[MAXN];
struct node
{
int left, right;
LL s, Max;
node *ch[2];
}pool[MAXN << 2], *root;
inline void pushup(node *r)
{
r->s = r->ch[0]->s + r->ch[1]->s;
r->Max = max(r->ch[0]->Max, r->ch[1]->Max);
}
inline void Build_Tree(node *r, int left, int right)
{
r->left = left;
r->right = right;
if(left == right)
{
r->s = r->Max = a[left];
return ;
}
int mid = (left + right) / 2;
node *lson = &pool[++cnt];
node *rson = &pool[++cnt];
r->ch[0] = lson;
r->ch[1] = rson;
Build_Tree(lson, left, mid);
Build_Tree(rson, mid + 1, right);
pushup(r);
}
inline void change(node *r, int left, int right)
{
if(r->left == r->right)
{
r->s = sqrt(r->s);
r->Max = sqrt(r->Max);
return ;
}
int mid = (r->left +r-> right) / 2;
if(left <= mid && r->ch[0]->Max > 1) change(r->ch[0], left, right);
if(mid < right && r->ch[1]->Max > 1) change(r->ch[1], left, right);
pushup(r);
}
inline LL query(node *r, int left, int right)
{
if(r->left == left && r->right == right)
return r->s;
if(r->ch[0]->right >= right) return query(r->ch[0], left, right);
else if(r->ch[1]->left <= left) return query(r->ch[1], left, right);
else
return query(r->ch[0], left, r->ch[0]->right) +
query(r->ch[1], r->ch[1]->left, right);
}
int main()
{
scanf("%d", &n);
root = &pool[0];
for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
scanf("%d", &m);
Build_Tree(root, 1, n);
for(int i = 1; i <= m; i++)
{
int opt, l, r;
scanf("%d%d%d", &opt, &l, &r);
if(l > r) swap(l, r);
if(opt) printf("%lld
", query(root, l, r));
else change(root, l, r);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Leetcode 면접 문제 16.17. 연속 수열 - JAVA제목 전송 문 Leetcode 면접 문제 16.17. 연속 수열 - JAVA 제목 해법 동적 계획 (DP) 사고방식 코드 제목. 정수 배열 (양수 가 있 고 음수 가 있 음) 을 정 하고 전체 와 가장 큰 연속 수열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.