QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#358749#4629. Longest Increasing SubsequenceKevin5307WA 0ms3596kbC++201.9kb2024-03-19 23:34:372024-03-19 23:34:37

Judging History

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

  • [2024-03-19 23:34:37]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3596kb
  • [2024-03-19 23:34:37]
  • 提交

answer

//Author: Kevin
#include<bits/stdc++.h>
//#pragma GCC optimize("O2")
using namespace std;
#define ll long long
#define ull unsigned ll
#define pb emplace_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define rALL(x) (x).rbegin(),(x).rend()
#define srt(x) sort(ALL(x))
#define rev(x) reverse(ALL(x))
#define rsrt(x) sort(rALL(x))
#define sz(x) (int)(x.size())
#define inf 0x3f3f3f3f
#define pii pair<int,int>
#define lb(v,x) (int)(lower_bound(ALL(v),x)-v.begin())
#define ub(v,x) (int)(upper_bound(ALL(v),x)-v.begin())
#define uni(v) v.resize(unique(ALL(v))-v.begin())
#define longer __int128_t
void die(string S){puts(S.c_str());exit(0);}
ll a[100100];
ll dp[100100][62];
ll val[100100];
array<ll,3> calc(ll len,int d)
{
	if(len==1) return {0,0,0};
	if(len==2)
	{
		if(!d) return {1,1,1};
		return {1,1,0};
	}
	if(len==3)
	{
		if(d==1)
			return {1,2,2};
		return {2,2,0};
	}
	array<ll,3> a1=calc(len/2,d-1),a2=calc(len-len/2,d-1);
	return {a1[0]+a2[0],max({a1[0]+a2[1],a1[1]+a2[2]}),a1[2]+a2[2]};
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=2;i<=n;i++)
	{
		array<ll,3> tmp=calc(a[i]-a[i-1],__lg(a[i]-a[i-1]-1));
		val[i]=max({tmp[0],tmp[1],tmp[2]});
	}
	for(int i=n;i>1;i--)
		for(int j=0;j<=61;j++)
		{
			dp[i][j]=max(dp[i+1][j],dp[i][j]);
			if((1ll<<j)<=a[i]-a[i-1]-1)
			{
				if((1ll<<j+1)-1<=a[i]-a[i-1]-1)
				{
					dp[i][j]=max(dp[i][j],dp[i+1][j]+(1ll<<j));
					if((1ll<<j+1)-1==a[i]-a[i-1]-1)
						for(int j2=j+1;j2<=61;j2++)
							dp[i][j]=max(dp[i][j],dp[i+1][j2]+(1ll<<j));
				}
				else
				{
					dp[i][j]=max(dp[i][j],dp[i+1][j]+a[i]-a[i-1]-(1ll<<j));
					for(int j2=j;j2<=61;j2++)
						dp[i][j-1]=max(dp[i][j-1],dp[i+1][j2]+val[i]);
				}
			}
		}
	ll ans=0;
	for(int i=2;i<=n;i++)
		for(int j=0;j<=61;j++)
			ans=max(ans,i-1+dp[i][j]);
	cout<<ans<<endl;
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

7
7 41 53 58 75 78 81

output:

22

result:

ok single line: '22'

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 3572kb

input:

8
174 223 259 368 618 738 893 1810

output:

798

result:

wrong answer 1st lines differ - expected: '671', found: '798'