QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#287208#7417. Honorable Mentionhy233WA 1374ms34468kbC++144.0kb2023-12-19 23:05:512023-12-19 23:05:51

Judging History

你现在查看的是最新测评结果

  • [2023-12-19 23:05:51]
  • 评测
  • 测评结果:WA
  • 用时:1374ms
  • 内存:34468kb
  • [2023-12-19 23:05:51]
  • 提交

answer

#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
const int N=35005;
const int inf=0x3f3f3f3f;
inline int rd()
{
	int x=0; bool f=1;
	char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())
		if(ch=='-') f=0;
	for(;ch>='0'&&ch<='9';ch=getchar())
		x=x*10+(ch^48);
	return f?x:-x;
}
int a[N];
vector<int> vec[N<<2][2][2];
#define mid ((l+r)>>1)
vector<int> merge(const vector<int> &va,const vector<int> &vb)
{
	if(va.empty()||vb.empty()) return vector<int>();
	vector<int> wow;
	for(int i=1;i<va.size();i++)
		wow.push_back(va[i]-va[i-1]);
	for(int i=1;i<vb.size();i++)
		wow.push_back(vb[i]-vb[i-1]);
	sort(wow.begin(),wow.end(),greater<int>());
	vector<int> res;
	res.push_back(va[0]+vb[0]);
	for(int v:wow)
		res.push_back(res.back()+v);
	
	// for(int v:va) cout<<v<<' '; cout<<endl;
	// for(int v:vb) cout<<v<<' '; cout<<endl;
	// for(int v:res) cout<<v<<' '; cout<<endl;
	return res;
}
void build(int l,int r,int p)
{
	if(l==r)
	{
		vec[p][0][0].push_back(0);
		vec[p][1][1].push_back(-inf);
		vec[p][1][1].push_back(a[l]);
		return;
	}
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	for(int u=0;u<=1;u++) //[u,nu][nv,v]
		for(int v=0;v<=1;v++)
		{
			auto &f=vec[p][u][v];
			for(int nu=0;nu<=1;nu++)
				for(int nv=0;nv<=1;nv++)
				{
					vector<int> now=merge(vec[p<<1][u][nu],vec[p<<1|1][nv][v]);
					if(now.empty()) continue;
					for(int i=f.size();i<now.size();i++)
						f.push_back(now[i]);
					for(int i=1;i<now.size();i++)
						f[i]=max(f[i],now[i]);
					if(nu==1&&nv==1)
					{
						for(int i=1;i<now.size();i++)
							now[i-1]=now[i];
						now.pop_back();
						for(int i=1;i<now.size();i++)
							f[i]=max(f[i],now[i]);
					}
				}
				// cout<<"out "<<l<<' '<<r<<' '<<u<<" "<<v<<endl;
				// 		for(int v:f)
				// 			cout<<v<<' ';cout<<endl;
		}
	// cout<<l<<" "<<r<<endl;
	// for(int v:vec[p][1][1])
	// 	cout<<v<<' ';
	// cout<<endl;
}
int D;
pair<int,int> cmx(pair<int,int> a,pair<int,int> b)
{
	if(a.first==b.first)
		return a.second<b.second?a:b;
	return a.first>b.first?a:b;
}
struct Node
{
	pair<int,int> a[2][2];
	Node()
	{ memset(a,0,sizeof(a)); }
	Node operator+(const Node b) const
	{
		Node c;
		for(int u=0;u<=1;u++) //[u,nu][nv,v]
			for(int v=0;v<=1;v++)
				for(int nu=0;nu<=1;nu++)
					for(int nv=0;nv<=1;nv++)
					{
						// cout<<a[u][nu].first<<' '<<a[u][nu].second<<' '<<a[nv][v].first<<' '<<a[nv][v].second<<(nv&&nu?"bing":"no")<<endl;
						pair<int,int> tmp(a[u][nu].first+b.a[nv][v].first,a[u][nu].second+b.a[nv][v].second);
						c.a[u][v]=cmx(c.a[u][v],tmp);
						if(nu&&nv)
						{
							tmp.first-=D,tmp.second--;
							c.a[u][v]=cmx(c.a[u][v],tmp);
						}
					}
		return c;
	}
};
pair<int,int> fnd(const vector<int> &v)
{
	// for(int vv:v)
	// 	cout<<vv<<' ';cout<<endl;
	if(v.empty()) return {-inf,0};
	int l=0,r=v.size()-1;
	while(l<r)
	{
		int m=(l+r)>>1;
		if(v[m+1]-v[m]>-D)
			l=mid+1;
		else
			r=mid;
	}
	// cout<<v[l]+l*D<<' '<<l<<endl;
	return {v[l]+l*D,l};
}
Node que(int l,int r,int p,int ld,int rd)
{
	if(l>=ld&&r<=rd)
	{
		Node wow;
		for(int u=0;u<=1;u++)
			for(int v=0;v<=1;v++)
				wow.a[u][v]=fnd(vec[p][u][v]);
		return wow;
	}
	if(ld<=mid&&rd>mid)
		return que(l,mid,p<<1,ld,rd)+que(mid+1,r,p<<1|1,ld,rd);
	if(ld<=mid)
		return que(l,mid,p<<1,ld,rd);
	else
		return que(mid+1,r,p<<1|1,ld,rd);
}
#undef mid
int n,q;
pair<int,int> solve(int l,int r)
{
	Node wow=que(1,n,1,l,r);
	return cmx(cmx(wow.a[0][0],wow.a[0][1]),cmx(wow.a[1][0],wow.a[1][1]));
}
signed main()
{
	n=rd(),q=rd();
	for(int i=1;i<=n;i++)
		a[i]=rd();
	build(1,n,1);
	while(q--)
	{
		int ql=rd(),qr=rd(),k=rd();
		int l=-1e9,r=1e9;
		int ans=0;
		while(l<=r)
		{
			D=(l+r)>>1;
			pair<int,int> now=solve(ql,qr);
			// cout<<D<<" "<<now.first<<' '<<now.second<<endl;
			if(now.second==k)
			{
				ans=now.first-k*D;
				break;
			}
			if(now.second<k)
				ans=now.first-k*D,l=D+1;
			else
				r=D-1;
		}
		if(n==25000) cout<<D<<' ';
		printf("%lld\n",ans);
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 17132kb

input:

5 5
-1 2 -3 4 -5
1 5 1
1 5 2
1 5 3
1 5 4
1 5 5

output:

4
6
5
2
-3

result:

ok 5 number(s): "4 6 5 2 -3"

Test #2:

score: 0
Accepted
time: 0ms
memory: 16864kb

input:

5 1
7 7 7 7 7
1 5 1

output:

35

result:

ok 1 number(s): "35"

Test #3:

score: -100
Wrong Answer
time: 1374ms
memory: 34468kb

input:

25000 25000
-11889 -16468 18402 -13238 14125 12120 -3295 -12106 20152 7478 8575 9968 -13946 -13408 23715 -14670 -21837 12589 7029 20609 2868 12728 -6942 982 5884 -7561 -2058 -7892 7806 16344 14645 13904 7355 9860 15446 -539 24072 21969 19028 -24939 -21911 -11836 21045 -4727 -3882 2138 18513 -4796 -1...

output:

1 10341941
-7497 44514177
20487 6687268
-2259 77971944
-10981 99605102
1 107722534
7311 15473041
17443 17383093
1 62015893
10250 10703102
10774 41214044
-54719 22952490
8939 9407209
18654 9022260
11017 39351814
13042 72311292
12097 5178065
16002 42027491
1 52700848
19998 38135774
2234 37045964
-1754...

result:

wrong answer 1st numbers differ - expected: '10341941', found: '1'