记录编号 244199 评测结果 AAAAAATTTTTTTTTTTTTT
题目名称 1897.[国家集训队2011]工作评估 最终得分 30
用户昵称 mikumikumi 是否通过 未通过
代码语言 C++ 运行时间 42.007 s
提交时间 2016-03-31 17:20:22 内存使用 4.33 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int SIZEP=250,SIZEN=50010,INF=0x7fffffff/2;
class poi
{
public:
	int l,r;
	int G,S;
	void print()
	{
		cout<<l<<" "<<r<<endl;
		cout<<"G:"<<G<<" "<<"S:"<<S<<endl;
	}
};
int D[SIZEN],L[SIZEN],N,M;
int get(int X,int a,int b)
{
	int tem=X;
	for(int i=a;i<=b;i++)
		tem=min(tem+D[i],L[i]);
	return tem;
}
int sum(int a,int b)
{
	int tem=0;
	for(int i=a;i<=b;i++)
		tem+=D[i];
	return	tem;
}
bool cmp(poi a,poi b)
{
	if(a.G==b.G) return a.S>b.S;
	return a.G>b.G;
}
class miku//块
{
    public:
	poi s[SIZEP];
	poi L[SIZEP];
	poi R[SIZEP];
	int st,en;
	int size,siza,sizb;
	int G,S;
	void make()
	{
		static poi P[SIZEN];
		int tot=0;
		for(int i=st;i<=en;i++)
		{
			for(int j=i;j<=en;j++)
			{
				++tot;
				P[tot].G=get(INF,i,j);
				P[tot].S=sum(i,j);
				P[tot].l=i;P[tot].r=j;
				if(i==st&&j==en) S=P[tot].S,G=P[tot].G;
			}
		}
		sort(P+1,P+1+tot,cmp);
		size=0;
		s[++size]=P[1];
		for(int i=2;i<=tot;i++) if(P[i].S>s[size].S) s[++size]=P[i];
		siza=sizb=0;
		for(int i=1;i<=tot;i++) 
		{
			if(P[i].l==st) 
			{
				if(siza==0||L[siza].S<P[i].S) L[++siza]=P[i];
			}
			if(P[i].r==en)
			{
				if(sizb==0||R[sizb].S<P[i].S) R[++sizb]=P[i];
			}
		}
	}
	int sum3(int x)//二分
	{
		int l=1,r=size;
		while(l<r)
		{
			int mid=(l+r)/2;
			if(s[mid].G>s[mid].S+x) l=mid+1;
			else r=mid;
		}
		int re=min(s[l].G,s[l].S+x);
		if(l>1) re=max(re,min(s[l-1].G,s[l-1].S+x));
		if(l<siza) re=max(re,min(s[l+1].G,s[l+1].S+x));
		return re;
	}
	int sum1(int x)//二分
	{
		int l=1,r=siza;
		while(l<r)
		{
			int mid=(l+r)/2;
			if(L[mid].G>L[mid].S+x) l=mid+1;
			else r=mid;
		}
		int re=min(L[l].G,L[l].S+x);
		if(l>1) re=max(re,min(L[l-1].G,L[l-1].S+x));
		if(l<siza) re=max(re,min(L[l+1].G,L[l+1].S+x));
		return re;
	}
	int sum2(int x)//二分
	{
		int l=1,r=sizb;
		while(l<r)
		{
			int mid=(l+r)/2;
			if(R[mid].G>R[mid].S+x) l=mid+1;
			else r=mid;
		}
		int re=min(R[l].G,R[l].S+x);
		if(l>1) re=max(re,min(R[l-1].G,R[l-1].S+x));
		if(l<sizb) re=max(re,min(R[l+1].G,R[l+1].S+x));
		return re;
	}
	void print()
	{
		cout<<st<<" "<<en<<endl;
		cout<<"size: "<<size<<endl;
		for(int i=1;i<=size;i++) s[i].print();
		cout<<"siza: "<<siza<<endl;
		for(int i=1;i<=siza;i++) L[i].print();
		cout<<endl;
		cout<<"sizb: "<<sizb<<endl;
		for(int i=1;i<=sizb;i++) R[i].print();
	}
}E[SIZEP];
void read()
{
	scanf("%d%d",&N,&M);
	for(int i=1;i<=N;i++) scanf("%d",&D[i]);
	for(int i=1;i<=N;i++) scanf("%d",&L[i]);
}
int best;
int piece;
void prepare()
{
	best=sqrt(N+1.0);
	int tot=1;
	E[tot].st=E[tot].en=1;
	for(int i=2;i<=N;i++)
	{
		//cout<<tot<<" "<<E[tot].en-E[tot].st+1<<endl;
		if(E[tot].en-E[tot].st+1==best)
		{
			E[tot].make();
			tot++;
			E[tot].st=E[tot].en=i;
		}
		E[tot].en=i;
	}
	E[tot].make();
	piece=tot;
	//for(int i=1;i<=tot;i++) E[i].print();
}
int Calc(int st,int ed,int X)
{
	int k1=(st-1)/best+1,k2=(ed-1)/best+1;
	miku A;
	//cout<<k1<<" "<<k2<<endl;
	if(k1==k2)
	{
		A.st=st,A.en=ed;
		A.make();
		//A.print();
		X=max(X,A.sum3(X));
		return X;
	}
	A.st=st,A.en=E[k1].en;
	A.make();
	//A.print();
	int ans=max(X,A.sum3(X));
	int Y=max(X,A.sum2(X));
	//cout<<Y<<endl;
	for(int i=k1+1;i<k2;i++)
	{
		ans=max(ans,E[i].sum3(X));
		ans=max(ans,E[i].sum1(Y));
		Y=min(Y+E[i].S,E[i].G);
		Y=max(Y,E[i].sum2(X));
		Y=max(Y,X);
	}
	A.st=E[k2].st,A.en=ed;
	A.make();
	ans=max(ans,A.sum1(Y));
	ans=max(ans,A.sum3(X));
	return ans;
}
void work()
{
	int st,ed,X;
	for(int i=1;i<=M;i++)
	{
		scanf("%d%d%d",&st,&ed,&X);
		int ans=Calc(st,ed,X);
		printf("%d\n",ans);
	}
}
int main()
{
	freopen("nt2011_zej_b.in","r",stdin);
	freopen("nt2011_zej_b.out","w",stdout);
	read();
	prepare();
	work();
	return 0;
}