HDUoj 1166 적군 포진 (나무 모양 배열/선분 수
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 86569 Accepted Submission(s): 36484
Problem Description
C 국 의 앙 숙 A 국 은 그동안 군사훈련 을 하고 있 었 기 때문에 C 국 간첩 두목 인 데 릭 과 그의 수하 인 티 디 는 또 바 빠 지기 시작 했다.A 국 가 는 해안선 을 따라 직선 으로 N 개 공병 캠프 를 배 치 했 는데, 데 릭 과 티 디 의 임 무 는 이들 공병 캠프 의 활동 상황 을 감시 하 는 것 이다.어떤 선진 적 인 모니터링 수단 을 취 했 기 때문에 각 공병 캠프 의 인원 C 개국 이 모두 파악 하고 있 는 것 은 명백 하 다. 각 공병 캠프 의 인원 은 변동 이 발생 할 수 있 고 몇 명의 인원 이 증가 하거나 감소 할 수 있 지만 이런 것들 은 C 국 의 감 시 를 피 할 수 없다.
중앙정보국 은 적 들 이 어떤 전술 을 연습 하 는 지 연구 해 야 하기 때문에 티 디 는 데 릭 에 게 연속 적 인 공병 캠프 가 모두 몇 명 인지 수시로 보고 해 야 한다. 예 를 들 어 데 릭 은 "티 디, 세 번 째 캠프 에서 10 번 째 캠프 까지 모두 몇 명 인지 즉시 보고 해 야 한다"고 물 었 다. 티 디 는 곧 이 구간 의 총 인원 을 계산 하고 보고 해 야 한다.그러나 적군 캠프 의 인원 이 자주 바 뀌 었 고 Derek 는 매번 질문 하 는 구간 이 다 르 기 때문에 Tidy 는 매번 한 캠프 에 가서 세 어야 했 습 니 다. 곧 지 쳐 버 렸 습 니 다. Derek 는 Tidy 의 계산 속도 에 대해 점점 불만 을 가지 게 되 었 습 니 다. "이 뚱뚱 한 놈 아, 계산 이 이렇게 느 리 니 해고 할 게!""네가 직접 계산 해 봐. 이 건 정말 힘 든 일이 야. 나 는 네가 나 를 해고 하 는 것 이 한스럽다."라 고 생각 하 자 어 쩔 수 없 이 티 디 는 컴퓨터 전문가 인 Windbreaker 에 게 전 화 를 걸 어 구 조 를 요청 했다. Windbreaker 는 "뚱 땡 이 야, 평소에 acm 문 제 를 많이 풀 고 계산 서 를 많이 보라 고 했 어. 이제 쓴맛 을 봤 지?"라 고 말 했다. 티 디 는 "내 가 잘 못 했 어."라 고 말 했다.하지만 Windbreaker 는 전 화 를 끊 었 습 니 다.Tidy 는 고민 이 많 습 니 다. 이렇게 계산 하면 그 는 정말 무 너 질 것 입 니 다. 똑똑 한 독자, 당신 은 프로그램 을 써 서 그 를 도와 이 일 을 완성 할 수 있 습 니까?하지만 프로그램 효율 이 높 지 않 으 면 Tidy 는 Derek 의 꾸지람 을 들 을 것 이다.
Input
첫 줄 의 정수 T 는 T 조 데이터 가 있 음 을 나타 낸다.
각 조 의 데이터 첫 번 째 줄 의 정수 N (N < = 50000) 은 적 에 게 N 개의 공병 캠프 가 있 고 그 다음 에 N 개의 정수 가 있 으 며, i 번 째 정수 ai 는 i 번 째 공병 캠프 에서 시작 할 때 ai 개인 (1 < = ai < = 50) 이 있다 는 것 을 나타 낸다.
다음 줄 마다 명령 이 있 습 니 다. 명령 은 네 가지 형식 이 있 습 니 다.
(1) Add i j, i 와 j 는 정수 로 i 번 째 캠프 에 j 개인 이 증가 하 는 것 을 나타 낸다 (j 는 30 을 초과 하지 않 는 다)
(2) Sub i j, i 와 j 는 정수 로 i 번 째 캠프 에서 j 개인 (j 가 30 을 초과 하지 않 음) 을 감소 하 는 것 을 나타 낸다.
(3) Query i j, i 와 j 는 정수 이 고 i < = j 는 i 에서 j 개 캠프 까지 의 총 인원 을 묻는다.
(4) End 는 끝 을 표시 합 니 다. 이 명령 은 각 그룹의 데이터 마지막 에 나타 납 니 다.
각 조 의 데 이 터 는 최대 40000 개의 명령 이 있다.
Output
i 조 데이터 에 대해 먼저 "Case i:"와 리 턴 을 출력 합 니 다.
모든 Query 문의 에 대해 하나의 정 수 를 출력 하고 차 로 돌아 가 문의 구간 의 총 인원 을 표시 합 니 다. 이 수 는 int 이내 에 있 습 니 다.
Sample Input
1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End
Sample Output
Case 1:
6
33
59
트 리 배열 & 선분 트 리 입문 템 플 릿 문제
트 리 배열 쓰기 트 리 배열 간단 한 소개http://blog.csdn.net/wang2332/article/details/70143534
#include
#include
#include
using namespace std;
#define N 50050
int a[N], c[N];
int n;
int lowbit(int x)
{
return x&(-x);
}
void update(int p, int x)
{
while(p <= n) {
c[p] += x;
p += lowbit(p);
}
}
int sum(int p)
{
int sum = 0;
while(p > 0) {
sum += c[p];
p -= lowbit(p);
}
return sum;
}
int main()
{
int T;
char str[10];
int u, v;
int k = 0;
scanf("%d",&T);
while(T--) {
int x;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
scanf("%d",&n);
for(int i = 1;i <= n; i++) {
scanf("%d",&x);
a[i] += x;
update(i,x);
}
printf("Case %d:
",++k);
while(~scanf("%s",str),strcmp(str,"End")) {
if(str[0] == 'A') {
scanf("%d%d",&u,&v);
a[u] += v;
update(u,v);
}
else if(str[0] == 'S') {
scanf("%d%d",&u,&v);
a[u] -= v;
update(u,-v);
}
else if(str[0] == 'Q') {
scanf("%d%d",&u,&v);
printf("%d
",sum(v)-sum(u-1));
}
}
}
return 0;
}
선분 트 리http://blog.csdn.net/wang2332/article/details/70145527
#include
using namespace std;
const int N = 400000+10;
struct node
{
int left, right;
int sum;
}tree[N];
void build(int l,int r,int step)
{
tree[step].left = l;
tree[step].right = r;
tree[step].sum = 0;
if(l == r) return ;
int mid = (l+r) >> 1;
build(l,mid,step<<1);
build(mid+1,r,step<<1|1);
}
void update(int l, int r, int value, int step)
{
tree[step].sum += value;
if(tree[step].left == tree[step].right)
return ;
int mid = (tree[step].left+tree[step].right) >> 1;
if(r <= mid) update(l,r,value,step<<1);
else if(l > mid) update(l,r,value,step<<1|1);
else {
update(l,mid,value,step<<1);
update(mid+1,r,value,step<<1|1);
}
}
int query(int l, int r,int step)
{
//找到叶子返回值
if(l==tree[step].left && r==tree[step].right) return tree[step].sum;
int mid = (tree[step].left+tree[step].right) >> 1;
//和更新类似
if(r <= mid) return query(l,r,step<<1);
if(l > mid) return query(l,r,step<<1|1);
else
return query(l,mid,step<<1)+query(mid+1,r,step<<1|1) ;
}
int main()
{
int T;
int u, v, k = 0;
char str[10];
scanf("%d",&T);
while(T--) {
int n, x;
scanf("%d",&n);
build(1,n,1);
for(int i = 1;i <= n; i++) {
scanf("%d",&x);
update(i,i,x,1);
}
printf("Case %d:
",++k);
while(~scanf("%s",str),strcmp(str,"End")) {
scanf("%d%d",&u,&v);
if(str[0] == 'A') {
update(u,u,v,1);
}
if(str[0] == 'S') {
update(u,u,-v,1);
}
if(str[0] == 'Q') {
printf("%d
",query(u,v,1));
}
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AZ-900을 자택 수험으로 무료 취득한 이야기 (2020/10)에서 2일간(오전중에만)의 온라인 트레이닝을 받는 것으로 무료 바우처를 받을 수 있다(등록 메일에 온다) 때문에, 부터 Peason VUE でスケジュール 버튼을 눌러, 화면에 따라 예약해 합격합시다 . ※2020/1...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.