QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#694492#7075. Let's Play Jigsaw Puzzles!ucup-team4352#WA 914ms147576kbC++232.0kb2024-10-31 18:04:412024-10-31 18:04:44

Judging History

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

  • [2024-10-31 18:04:44]
  • 评测
  • 测评结果:WA
  • 用时:914ms
  • 内存:147576kb
  • [2024-10-31 18:04:41]
  • 提交

answer

#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define lowbit(x) (x&-x)
#define log(x) (31^__builtin_clz(x))
using namespace std;
const int maxn=1e4+5;
int a[maxn];
vector<int>dp[maxn];
vector<pair<bool,unsigned short>>ans[maxn];
vector<short>loc[maxn];
int n;
int now[maxn];
short find(int x,int y,int nx,int ny){
	short l=y+1,r=n+1;
	while(l<r){
		short mid=l+r-1>>1;
		if((ans[x+1][mid-(x+1)].second|((int)ans[x+1][mid-(x+1)].first<<16))+nx>(ans[y+1][mid-(y+1)].second|((int)ans[y+1][mid-(y+1)].first<<16))+ny)l=mid+1;
		else r=mid;
	}
	return l;
}
void solve(){
	n=5e3;
	// cin>>n;
	for(int i=1;i<=n;i++){
		a[i]=i;
		// cin>>a[i];
		dp[i].resize(i+1);
	}
	for(int i=1;i<=n;i++){
		int mn=a[i],mx=a[i];
		for(int j=i;j<=n;j++){
			mx=max(mx,a[j]);
			mn=min(mn,a[j]);
			ans[i].push_back({(mx-mn)&65536,(mx-mn)&65535});
		}
	}
	dp[0]={0};
	
	for(int i=1;i<=n;i++){
		dp[i][1]=ans[1][i-1].second|((int)ans[1][i-1].first<<16);
		dp[i][i]=0;
		loc[i]={(short)i};
		for(int j=2;j<i;j++){
			while(now[j-1]+1<loc[j-1].size()&&find(loc[j-1][now[j-1]],loc[j-1][now[j-1]+1],dp[loc[j-1][now[j-1]]][j-1],dp[loc[j-1][now[j-1]+1]][j-1])<=i)now[j-1]++;
			dp[i][j]=dp[loc[j-1][now[j-1]]][j-1]+(ans[loc[j-1][now[j-1]]+1][i-(loc[j-1][now[j-1]]+1)].second|((int)ans[loc[j-1][now[j-1]]+1][i-(loc[j-1][now[j-1]]+1)].first<<16));
			// cout<<loc[j-1][now[j-1]]<<" "<<loc[j-1].size()<<"\n";
		}
		// cout<<"\n";
		if(i<n)
		for(int j=1;j<i;j++){
			while(loc[j].size()>1){
				int tmp=loc[j].back(),tmp1=loc[j][loc[j].size()-2];
				int nw=find(tmp,i,dp[tmp][j],dp[i][j]);
				int lst=find(tmp,tmp1,dp[tmp][j],dp[tmp1][j]);
				// if(0){
				if(nw<=lst){
					loc[j].pop_back();
				}
				else{
					break;
				}
			}
			loc[j].push_back(i);
		}
		// for(int j=1;j<=i;j++)cout<<dp[i][j]<<" ";cout<<"\n\n";
	}
	for(int j=1;j<=n;j++)cout<<dp[n][j]<<"\n";
}
int main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t=1;
    // cin>>t;
    while(t--)solve();
    return 0;
}
/*
*/

详细

Test #1:

score: 0
Wrong Answer
time: 914ms
memory: 147576kb

input:

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

output:

4999
4998
4997
4996
4995
4994
4993
4992
4991
4990
4989
4988
4987
4986
4985
4984
4983
4982
4981
4980
4979
4978
4977
4976
4975
4974
4973
4972
4971
4970
4969
4968
4967
4966
4965
4964
4963
4962
4961
4960
4959
4958
4957
4956
4955
4954
4953
4952
4951
4950
4949
4948
4947
4946
4945
4944
4943
4942
4941
4940
...

result:

wrong answer 1st lines differ - expected: '1 2', found: '4999'