+ Vendeur d'arbre segment de la pensée (Los Valley P2672)

vendeur

Titre description

Amin était un vendeur, il a reçu l' ordre de visser la rue pour vendre les produits de leur entreprise. Vis rue est une impasse, la sortie et l'entrée sont les mêmes, du côté de la paroi de la rue, l'autre côté étant le ménage. Vis N ménages totaux dans une rue, le i-ième locataires de l'entrée de l'appareil de mesure est Si. Depuis la même maison peut avoir un certain nombre de locataires, donc il peut y avoir un nombre égal de ménages de l'entrée. Amin entrerait de l'entrée, afin de promouvoir leurs produits aux ménages la famille X vis de la rue, puis aller de la même façon.
Amin Chaque mètre accumule 01h00 valeur de la fatigue, de promouvoir leurs produits accumuler la fatigue valeur Ai point du i-ème ménage. Amin est un bourreau de travail, il a voulu savoir, pour les différents X, sans façon inutile d'aller, et combien de points il a accumulé la valeur de la fatigue le plus.

Format d'entrée

La première ligne a un N entier positif, le nombre de vis ménages de rue.

La ligne suivante de N des nombres entiers positifs, dans lequel Si représente le i-ième nombre entier de ménages à la i-ième entrée. assurance données S_1≤S_2≤ ... ≤S_n <10 ^ 8 ligne suivante avec N un entier positif, dans lequel le nombre entier A_i représente le i-ième valeur du produit pour favoriser la fatigue accumule dans les i-ième ménages. assurance données A_i <1000

Format de sortie

N lignes de sortie, chacun un nombre entier positif, la i-ième rangée valeur entière de fatigue lorsque X = i, Amin accumulé plus.


l'entretien des arbres de segment valeur maximale intervalle ;,

I-1 avant d' enregistrer la distance maximale des ménages mxl de l' utilisateur, lorsque la première distance de l' utilisateur est inférieure à la valeur maximale i, aucune opération,
si elle est supérieure à la valeur maximale, la valeur de l'utilisateur i mxl- devient la valeur de la fatigue de la maison, i + 1 de la n-ième utilisateur à l'utilisateur moins le i-ème utilisateur de l'MXL à distance de l'utilisateur;

code:

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100010;
const int M=2000100;
const LL mod=2e9;
int n,s[N],a[N];
struct Node{
	int l,r,num;
	LL mx,lt;
}tr[N*4];
void pp(int k){
	if(tr[ls].mx>=tr[rs].mx) tr[k].mx=tr[ls].mx,tr[k].num=tr[ls].num;
	else tr[k].mx=tr[rs].mx,tr[k].num=tr[rs].num;
}
void pd(int k){
	if(tr[k].lt){
		tr[ls].mx-=tr[k].lt;
		tr[rs].mx-=tr[k].lt;
		tr[ls].lt+=tr[k].lt;
		tr[rs].lt+=tr[k].lt;
	}
	tr[k].lt=0;
}
void build(int l,int r,int k){
	tr[k].l=l,tr[k].r=r;
	if(l==r){
		tr[k].mx=(LL)(2*s[l]+a[l]);
		tr[k].num=l;
		return;
	}
	int d=(l+r)>>1;
	build(l,d,ls);
	build(d+1,r,rs);
	pp(k);
}
void update1(int l,int r,int k){
	if(tr[k].mx<=0||l>r) return;
	if(tr[k].l==tr[k].r){
		tr[k].mx=a[tr[k].num];
		return;
	}
	pd(k);
	int d=(tr[k].l+tr[k].r)>>1;
	if(l<=d) update1(l,r,ls);
	if(r>d) update1(l,r,rs);
	pp(k);
}
void update2(int l,int r,LL w,int k){
	if(tr[k].mx<=0||l>r) return;
	if(tr[k].l>=l&&tr[k].r<=r){
		tr[k].mx-=w;
		tr[k].lt+=w;
		return;
	}
	pd(k);
	int d=(tr[k].l+tr[k].r)>>1;
	if(l<=d) update2(l,r,w,ls);
	if(r>d) update2(l,r,w,rs);
	pp(k);
}
void dele(int pos,int k){
	if(tr[k].l==tr[k].r){
		tr[k].mx=0;
		return;
	}
	pd(k);
	int d=(tr[k].l+tr[k].r)>>1;
	if(pos<=d) dele(pos,ls);
	else dele(pos,rs);
	pp(k);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%d",&s[i]);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,n,1);
	LL ans=0;
	int mxl=0;
	for(int i=1;i<=n;i++){
		ans+=tr[1].mx;
		int k=tr[1].num;
		if(k>mxl){
			update1(mxl+1,k-1,1);
			update2(k+1,n,2ll*(s[k]-s[mxl]),1);
			mxl=k;
		}
		printf("%d\n",ans);
		dele(k,1);
	}
	return 0;
}
Publié 264 articles originaux · louange gagné 46 · vues 10000 +

Je suppose que tu aimes

Origine blog.csdn.net/qq_44291254/article/details/105268728
conseillé
Classement