[라인 트리] HDOJ 5361 In Touch
                                            
 2660 단어  세그먼트 트리
                    
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define lson o << 1, L, mid
#define rson o << 1 | 1, mid + 1, R
#define ls o << 1
#define rs o << 1 | 1
#define mp(x, y) make_pair(x, y)
const int maxn = 200005;
const LL INF = 1e16;
pair<LL, int> minv[maxn << 2];
LL lazy[maxn << 2];
LL ans[maxn];
int l[maxn];
int r[maxn];
int c[maxn];
int n, m;
void pushup(int o)
{
	if(minv[ls].first == -1) {
		if(minv[rs].first == -1) minv[o] = mp(-1LL, 0);
		else minv[o] = minv[rs];
	}
	else {
		if(minv[rs].first == -1) minv[o] = minv[ls];
		else minv[o] = min(minv[ls], minv[rs]);
	}
}
void pushdown(int o)
{
	if(lazy[o] != INF) {
		minv[ls].first = min(minv[ls].first, lazy[o]);
		minv[rs].first = min(minv[rs].first, lazy[o]);
		lazy[ls] = min(lazy[ls], lazy[o]);
		lazy[rs] = min(lazy[rs], lazy[o]);
		lazy[o] = INF;
	}
}
void build(int o, int L, int R)
{
	lazy[o] = INF;
	if(L == R) {
		if(L == 1) minv[o] = mp(0LL, L);
		else minv[o] = mp(INF, L);
		return;
	}
	int mid = (L + R) >> 1;
	build(lson);
	build(rson);
	pushup(o);
}
void update(int o, int L, int R, int ql, int qr, LL v)
{
	if(ql <= L && qr >= R) {
		lazy[o] = min(lazy[o], v);
		minv[o].first = min(minv[o].first, v);
		return;
	}
	pushdown(o);
	int mid = (L + R) >> 1;
	if(ql <= mid) update(lson, ql, qr, v);
	if(qr > mid) update(rson, ql, qr, v);
	pushup(o);
}
void update(int o, int L, int R, int q)
{
	if(L == R) {
		minv[o].first = -1;
		return;
	}
	pushdown(o);
	int mid = (L + R) >> 1;
	if(q <= mid) update(lson, q);
	else update(rson, q);
	pushup(o);
}
void work()
{
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) scanf("%d", &l[i]);
	for(int i = 1; i <= n; i++) scanf("%d", &r[i]);
	for(int i = 1; i <= n; i++) scanf("%d", &c[i]);
	
	build(1, 1, n);
	
	for(int i = 1; i <= n; i++) ans[i] = INF;
	for(int C = 1; C <= n; C++) {
		LL v = minv[1].first;
		int id = minv[1].second;
		if(v == -1) break;
		ans[id] = v;
		update(1, 1, n, id);
		int ql = id + l[id], qr = min(id + r[id], n);
		if(qr >= ql) update(1, 1, n, ql, qr, v + c[id]);
		ql = max(id - r[id], 1), qr = id - l[id];
		if(qr >= ql) update(1, 1, n, ql, qr, v + c[id]);
	}
	for(int i = 1; i <= n; i++) {
		if(ans[i] == INF) printf("-1%c", i == n ? '
' : ' ');
		else printf("%lld%c", ans[i], i == n ? '
' : ' ');
	}
}
int main()
{
	int _;
	scanf("%d", &_);
	while(_--) work();
	
	return 0;
}이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
백준 알고리즘 14427번 : 수열과 쿼리 15길이가 N인 수열 A1, A2, ..., AN이 주어진다. 이때, 다음 쿼리를 수행하는 프로그램을 작성하시오. 1 i v : Ai를 v로 바꾼다. (1 ≤ i ≤ N, 1 ≤ v ≤ 109) 2 : 수열에서 크기가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.