记录编号 232729 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 水站 最终得分 100
用户昵称 GravatarNVIDIA 是否通过 通过
代码语言 C++ 运行时间 0.119 s
提交时间 2016-03-02 19:55:49 内存使用 1.00 MiB
显示代码纯文本
#include<fstream>
using namespace std;
class xx{
public:
	int x,y;
};
ifstream fin("station.in");
ofstream fout("station.out");
xx t,a[30000];
int p[30000],l[30000],w[30000],sum[30000];
bool done;
int n,tot,cost,m,k;
void up(int i){
	done=false;
	if (i==1) return;
	while (i!=1&&!done){
		if (a[i].x>a[i/2].x){
			t=a[i];
			a[i]=a[i/2];
			a[i/2]=t;
		}
		else
			done=true;
		i=i/2;
	}
}
void down(int i){
	cost=cost-a[1].y;
	a[1].x=-1000000000;
	done=false;
	if (i*2>tot) return;
	while(2*i<=tot&&!done){
		i=i*2;
		if (i+1<=tot&&a[i+1].x>a[i].x)
			i++;
		if (a[i/2].x<a[i].x){
			t=a[i/2];
			a[i/2]=a[i];
			a[i]=t;
		}
		else
			done=true;
	}
}
int main(){
	fin>>n;
for(int i=1;i<=n;i++){
fin>>w[i]>>l[i]>>p[i];
sum[i]=sum[i-1]+w[i];
}
tot=1;
a[1].x=sum[n]-l[n];
a[1].y=p[n];
if (w[n]>l[n])
	a[1].y=0;
cost=a[1].y;
m=cost;
for(int i=n-1;i>0;i--){
	while (a[1].x>sum[i-1])
		down(1);
	tot++;
	a[tot].x=sum[i]-l[i];
	a[tot].y=p[i];
	if (w[i]>l[i])
		a[tot].y=0;
	else
		cost=cost+p[i];
	up(tot);
	if (cost<m){
		m=cost;
		k=i;
	}
}

fout<<m<<endl;
fout<<k<<' ';
for(int i=k+1;i<=n;i++)
	if (sum[i]-sum[k-1]<=l[i])
		fout<<i<<' ';
	return 0;
}