BZOJ 1012 JSOI 2008 최대 치 max number 선분 트 리 물 문제
사고방식: 한눈 에 선분 나무 가 보 여서 할 말 이 없어 요.한 가지 만 주의해 야 합 니 다. 삽입 할 때 라인 트 리 의 범 위 는 시퀀스 의 총 수 를 따라 가지 마 십시오. 그러면 노드 를 만 든 후에 아버지 노드 의 정 보 를 업데이트 할 수 없습니다.
CODE:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 200010
#define MO d
#define LEFT (pos << 1)
#define RIGHT (pos << 1|1)
using namespace std;
int cnt,asks,d;
int tree[MAX << 2];
int last;
char c[10];
void Modify(int l,int r,int aim,int pos,int c);
int Ask(int l,int r,int x,int y,int pos);
int main()
{
cin >> asks >> d;
for(int x,i = 1;i <= asks; ++i) {
scanf("%s",c);
switch(c[0]) {
case 'Q':
scanf("%d",&x);
last = Ask(1,MAX - 1,cnt - x + 1,cnt,1);
printf("%d
",last);
break;
case 'A':
cnt++;
scanf("%d",&x);
Modify(1,MAX - 1,cnt,1,(x + last) % MO);
break;
}
}
return 0;
}
void Modify(int l,int r,int aim,int pos,int c)
{
if(l == r) {
tree[pos] = c;
return ;
}
int mid = (l + r) >> 1;
if(aim <= mid) Modify(l,mid,aim,LEFT,c);
else Modify(mid + 1,r,aim,RIGHT,c);
tree[pos] = max(tree[LEFT],tree[RIGHT]);
}
int Ask(int l,int r,int x,int y,int pos)
{
if(l == x && r == y) return tree[pos];
int mid = (l + r) >> 1;
if(y <= mid) return Ask(l,mid,x,y,LEFT);
if(x > mid) return Ask(mid + 1,r,x,y,RIGHT);
int left = Ask(l,mid,x,mid,LEFT);
int right = Ask(mid + 1,r,mid + 1,y,RIGHT);
return max(left,right);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.