QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#694492 | #7075. Let's Play Jigsaw Puzzles! | ucup-team4352# | WA | 914ms | 147576kb | C++23 | 2.0kb | 2024-10-31 18:04:41 | 2024-10-31 18:04:44 |
Judging History
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'