QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#694234#7075. Let's Play Jigsaw Puzzles!ucup-team4352#RE 0ms0kbC++232.0kb2024-10-31 17:31:452024-10-31 17:31:45

Judging History

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

  • [2024-10-31 17:31:45]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-10-31 17:31:45]
  • 提交

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<short,short>>loc[maxn];
int n;
int mx[maxn][15],mn[maxn][15];
int now[maxn],Log[maxn];
inline pii calc(int l,int r){
	int b=Log[r-l+1];
	return {min(mn[l][b],mn[r-(1<<b)+1][b]),max(mx[l][b],mx[r-(1<<b)+1][b])};
}
inline int solv(int l,int r){
	int b=Log[r-l+1];
	return -min(mn[l][b],mn[r-(1<<b)+1][b])+max(mx[l][b],mx[r-(1<<b)+1][b]);
}
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(solv(x+1,mid)+nx>solv(y+1,mid)+ny)l=mid+1;
		else r=mid;
	}
	return l;
}
void solve(){
	n=1e4;
	// cin>>n;
	for(int i=1;i<=n;i++){
		a[i]=i;
		// cin>>a[i];
		Log[i]=Log[i/2]+1;
		dp[i].resize(i+1);
	}
	dp[0]={0};
	for(int i=n;i>=1;i--){
		mn[i][0]=mx[i][0]=a[i];
		for(int j=1;j<15;j++){
			mn[i][j]=min(mn[i][j-1],mn[min(i+(1<<j-1),n)][j-1]);
			mx[i][j]=max(mx[i][j-1],mx[min(i+(1<<j-1),n)][j-1]);
		}
	}
	for(int i=1;i<=n;i++){
		dp[i][1]=solv(1,i);
		dp[i][i]=0;
		loc[i]={{i,0}};
		for(int j=2;j<i;j++){
			while(now[j-1]+1<loc[j-1].size()&&loc[j-1][now[j-1]+1].second<=i)now[j-1]++;
			dp[i][j]=dp[loc[j-1][now[j-1]].first][j-1]+solv(loc[j-1][now[j-1]].first+1,i);
			// cout<<loc[j-1][now[j-1]].first<<" "<<loc[j-1][now[j-1]].second<<" "<<loc[j-1][now[j-1]+1].second<<" "<<loc[j-1].size()<<"\n";
		}
		// cout<<"\n";
		for(int j=1;j<i;j++){
			while(loc[j].size()){
				int tmp=loc[j].back().first,nw=find(tmp,i,dp[tmp][j],dp[i][j]);
				if(0){
				// if(nw<=loc[j].back().second){
					loc[j].pop_back();
				}
				else{
					loc[j].push_back({i,nw});
					break;
				}
			}
		}
		// for(int j=1;j<=i;j++)cout<<dp[i][j]<<" ";cout<<"\n";
	}
	for(int j=1;j<=n;j++)cout<<dp[n][j]<<" ";cout<<"\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
Runtime Error

input:

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

output:


result: