我只是在 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