Cod sursa(job #255015)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 8 februarie 2009 13:36:38
Problema Cuburi2 Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.74 kb
#include<stdio.h>
#define infile "cuburi2.in"
#define outfile "cuburi2.out"
#define nmax (250*1000+1)
int h[nmax]; //vectorul cu inaltimile turnurilor
long long v1[nmax]; //vectorul in care calculam mutarile de la stanga
long long v2[nmax]; //vectorul in care calculam mutarile de la dreapta
int n; //numarul de turnuri
int t; //numarul de teste

void citire(int h[nmax], int *n, int *t)
	{
	int i;
	scanf("%d %d\n",n,t);
	for(i=1;i<=*n;i++) //citim inaltimea fiecarui turn
		scanf("%d",&h[i]);
	}

void fai_raspuns(int h[nmax], long long v1[nmax], long long v2[nmax], int x, int y)
	{
	long long nr; //variabila in care vom retine la un anumit timp...cate cuburi mutam
	int i,p; //cele doua capete ale intervalului
	for(nr=0,i=x;i<y;i++) //calculam pt mutarile din partea stanga
		{ nr+=h[i]; v1[i+1]=v1[i]+nr; } //costul pozitiei urmatoare
	for(nr=0,i=y;i>x;i--) //calculam pentru mutarile din partea dreapta
		{ nr+=h[i]; v2[i-1]=v2[i]+nr; } //costul pozitiei urmatoare (care defapt e pozitie anterioara)
	nr=v1[x]+v2[x]; p=x;//luam initial k le-am muta pe toate la x
	for(i=x;i<=y;i++) //trecem pe la fiecare pozitie
		{
		if(v1[i]+v2[i]<nr) { nr=v1[i]+v2[i]; p=i; } //am gasit o pozitie udne daca le mutam...costul e mai mic
		v1[i]=v2[i]=0; //golim pozitia
		}
	printf("%d %lld\n",p,nr); //afisem pozitia cu costul minim, si costul
	}

int main()
{
int x,y;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

citire(h,&n,&t); //citim datele din fisier
while(t--) //avem teste de facut
	{
	scanf("%d %d\n",&x,&y); //citim intervalul pt care trebuie sa facem raspunsul
	//calculam si afisem pozitia si costul
	if(y<x)	fai_raspuns(h,v1,v2,y,x);
	else fai_raspuns(h,v1,v2,x,y);
	}

fclose(stdin);
fclose(stdout);
return 0;
}