- Quiz
- AC
- 解説
- 範囲の全探索。colorごとの累積和を持てば各色の集計も高速にできる
- その他
- 汎用的に構造体で書けると以前から思っていたので、ちょうどいい問題が来たので構造体化した
struct AccSum{
vector<ll> Ac;
ll L;
AccSum(){}
AccSum(vector<ll> &A){
L = A.size();
Ac.resize(L+1);
FOR(i, 0, L){
Ac[i+1] = Ac[i] + A[i];
}
}
ll sum(ll a, ll b){
if(a<0){
debug("[AccSum]a<0",a);exit(0);
return -1;
}
if(b>L){
debug("[AccSum]b>L-1",b,L-1);exit(0);
return -1;
}
return Ac[b] - Ac[a];
}
};
struct RangeCounter{
ll N;
vector<AccSum> Accs;
ll ma=-1;
RangeCounter(VI A, ll val_max){
N = A.size();
ma = val_max;
VV V(ma+1, VI(N));
rep(i,N){
ll v = A[i];
V[v][i]=1;
}
rep(v,ma+1){
Accs.push_back(AccSum(V[v]));
}
}
VI count(ll l, ll r){
VI ret;
rep(v,ma+1){
ll cnt = Accs[v].sum(l,r);
ret.push_back(cnt);
}
return ret;
}
ll count(ll l, ll r, ll v){
return Accs[v].sum(l,r);
}
};
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
ll N,M;
cin>>N>>M;
VI A(N);
rep(i, N){
cin >> A[i];
A[i]--;
}
RangeCounter rc(A,M-1);
VI T(M);
rep(i,M)cin>>T[i];
debug(T);
rep(l,N){
FOR(r,l,N){
VI C = rc.count(l,r+1);
if(T==C)yes();
}
}
no();
return 0;
}
verified