这个 CE 报错信息是啥意思?
  • 板块灌水区
  • 楼主__vector__
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/5/17 17:04
  • 上次更新2024/5/17 20:07:36
查看原帖
这个 CE 报错信息是啥意思?
507348
__vector__楼主2024/5/17 17:04

我只是在 lambda 函数里访问了一个局部定义的数组。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	int t;
	cin>>t;
	
	while(t--){
		int n;
		cin>>n;
		vector<int> lsteqb(n+1);
		vector<int> lstokpos(n+1,1e9);
		vector<int> a(n+1),b(n+1);
		vector<int> dp(n+1,0);
		int st[18][n+2];
		int _lg[n+2];
		dp[0]=1;
		lstokpos[0]=0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			st[0][i]=a[i];
		}
		for(int i=2;i<=n;i++){
			_lg[i]=_lg[i>>1]+1;
		}
		for(int i=1;i<=17;i++){
			for(int j=1;j+(1<<i)-1<=n;j++){
				st[i][j]=max(st[i-1][j],st[i-1][j+(1<<i-1)]);
			}
		}
		auto qmx = [&](int l,int r){
			int _=_lg[r-l+1];
			return max(st[_][l],st[_][r-(1<<_)+1]);
		};
		for(int i=1;i<=n;i++){
			cin>>b[i];
			if(b[i]==b[i-1]){
				lsteqb[i]=lsteqb[i-1];
			}else {
				lsteqb[i]=i;
			}
		}
		auto rigest = [&](int r){
			// 满足 max_a {ans,ans+1,..,r} = b[r] 的最右边的节点
			// 要求 b_ans = b_ans+1 = ... = b_r
			int efl=lsteqb[r];
			int efr=r;
			int ok=-1;
			while(efl<=efr){
				int mid=(efl+efr)/2;
				if(qmx(mid,r)>b[r]){
					efl=mid+1;
				}else if(qmx(mid,r)==b[r]){
					ok=mid;
					efl=mid+1;
				}else{
					efr=mid-1;
				}
			}
			return ok;
		};
		auto lefest = [&](int r){
			// 满足 max_a {ans,ans+1,..,r} = b[r] 的最右边的节点
			// 要求 b_ans = b_ans+1 = ... = b_r
			int efl=lsteqb[r];
			int efr=r;
			int ok=-1;
			while(efl<=efr){
				int mid=(efl+efr)/2;
				if(qmx(mid,r)>b[r]){
					efl=mid+1;
				}else if(qmx(mid,r)==b[r]){
					ok=mid;
					efr=mid-1;
				}else{
					efr=mid-1;
				}
			}
			return ok;
		};
		for(int i=1;i<=n;i++){
			if(a[i]==b[i]){
				dp[i]=dp[i-1];
			}
			int lef=lefest(i);
			int rig=rigest(i);
			if(rig==-1){
				continue;
			}
			if(lstokpos[rig]>=lef){
				dp[i]=1;
			}	
			if(dp[i]){
				lstokpos[i]=i;
			}else{
				lstokpos[i]=lstokpos[i-1];
			}
		}
		puts(dp[n]?"Yes":"No");
	}
	return 0;
}
Compile Error 0ms 0KiB
foo.cc: In lambda function:
foo.cc:33:36: sorry, unimplemented: capture of variably-modified type ‘int [18][(n + 2)]’ that is not an N3639 array of runtime bound
   33 |                         return max(st[_][l],st[_][r-(1<<_)+1]);
      |                                    ^~
foo.cc:33:36: note: because the array element type ‘int [(n + 2)]’ has variable size
foo.cc:33:45: sorry, unimplemented: capture of variably-modified type ‘int [18][(n + 2)]’ that is not an N3639 array of runtime bound
   33 |                         return max(st[_][l],st[_][r-(1<<_)+1]);
      |                                             ^~
foo.cc:33:45: note: because the array element type ‘int [(n + 2)]’ has variable size
2024/5/17 17:04
加载中...