记录编号 220826 评测结果 AAAAAAAAAA
题目名称 [HZOI 2015] Red Green Lights 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 2.136 s
提交时间 2016-01-20 15:33:22 内存使用 120.42 MiB
显示代码纯文本
#include<cstdio>
#define ll long long
inline ll MIN(ll A,ll B){return A<B?A:B;}
ll n,m,g,r,T,cnt=1,s[1100000],t[1100000];
ll L,R,X,W;
struct node
{
	ll l,r,min;
}o[5100000];
inline void add(int l,int r,int t)
{
	if(l==r)
	{
		o[t].min=MIN(o[t].min,W);
		return;
	}
	int mid=l+r>>1;
	if(X<=mid)
	{
		if(!o[t].l)
			o[t].l=++cnt;
		add(l,mid,o[t].l);
	}
	else
	{
		if(!o[t].r)
			o[t].r=++cnt;
		add(mid+1,r,o[t].r);
	}
	o[t].min=MIN(o[o[t].l].min,o[o[t].r].min);
}
inline void find(int l,int r,int t)
{
	if(L<=l&&r<=R)
	{
		X=MIN(X,o[t].min);
		return;
	}
	int mid=l+r>>1;
	if(mid>=L&&o[t].l)
		find(l,mid,o[t].l);
	if(mid<R&&o[t].r)
		find(mid+1,r,o[t].r);
}
void init()
{
	for(int i=0;i<5100000;++i)
		o[i].min=0x7fffffffffffffff;
	scanf("%lld%lld%lld",&n,&g,&r);
	T=g+r;
	for(int i=0;i<=n;++i)
		scanf("%lld",&s[i]);
	for(int i=1;i<=n;++i)
		s[i]+=s[i-1];
	for(int i=n;i>-1;--i)
	{
		W=i;
		X=s[i]%T;
		add(0,T,1);
		if(i)
			W=(T-s[i-1]%T)%T;
		else
			W=0;
		X=1e9;
		L=((g-W)%T+T)%T,R=((T-1-W)%T+T)%T; 
		if(L<=R)
			find(0,T,1);			
		else
		{
			ll LL=L,RR=R;
			L=0,R=RR;
			find(0,T,1);
			L=LL,R=T-1;
			find(0,T,1);
		}
		if(X<1e9)
		{
			if(X!=n)
			{
				if(i)
					t[i]=T-(s[X]-s[i-1])%T+s[X]-s[i-1]+t[X+1];
				else
					t[i]=T-s[X]%T+s[X]+t[X+1];		
			}
			else
			{
				if(i)
					t[i]=s[n]-s[i-1];
				else
					t[i]=s[n];
			}
		}
		else
		{
			if(i)
				t[i]=s[n]-s[i-1];
			else
				t[i]=s[n];				
		}
	}
}
void solve()
{
	scanf("%lld",&m);
	ll ans,tip;
	while(m--)
	{
		ans=0;
		scanf("%lld",&tip);
		W=tip%T;
		X=1e9;
		L=((g-W)%T+T)%T,R=((T-1-W)%T+T)%T; 
		if(L<=R)
			find(0,T,1);			
		else
		{
			ll LL=L,RR=R;
			L=0,R=RR;
			find(0,T,1);
			L=LL,R=T-1;
			find(0,T,1);		
		}
		if(X<1e9)
		{
			if(X!=n)
				ans=tip+T-(tip+s[X])%T+s[X]+t[X+1];		
			else
				ans=tip+s[n];
		}
		else
			ans=tip+s[n];
		printf("%lld\n",ans);
	}
}
int main()
{
	freopen("rgl.in","r",stdin);
	freopen("rgl.out","w",stdout);
	init();
	solve();
}