Submission #1266246

#TimeUsernameProblemLanguageResultExecution timeMemory
1266246wjqPainting Walls (APIO20_paint)C++20
100 / 100
340 ms30920 KiB
#ifndef memset0
  #include"paint.h"
#endif
#include<bits/stdc++.h>
const int N=1e5+10;
int n,m,k,l[N],r[N],c[N],a[N],sum[N];
std::set<int> s[N];
std::vector<int> b[N];
struct node{
  int mid,l,r,min;
}p[N<<2];
void build(int u,int l,int r){
  p[u].l=l,p[u].r=r,p[u].mid=(l+r)>>1,p[u].min=1e9;
  if(l==r){
    return;
  }
  build(u<<1,l,p[u].mid);
  build(u<<1|1,p[u].mid+1,r);
}
void modify(int u,int k,int w){
  if(p[u].l==p[u].r){
    p[u].min=w;
    return;
  }
  modify(k<=p[u].mid?(u<<1):(u<<1|1),k,w);
  p[u].min=std::min(p[u<<1].min,p[u<<1|1].min);
}
int query(int u,int l,int r){
  if(p[u].l==l&&p[u].r==r){
    return p[u].min;
  }
  if(r<=p[u].mid)return query(u<<1,l,r);
  if(l>p[u].mid)return query(u<<1|1,l,r);
  return std::min(query(u<<1,l,p[u].mid),query(u<<1|1,p[u].mid+1,r));
}
int minimumInstructions(int N,int M,int K,std::vector<int> C,std::vector<int> A,std::vector<std::vector<int>> B){
  n=N,m=M,k=K;
  for(int i=0;i<n;i++)c[i]=C[i];
  for(int i=0;i<m;i++){
    a[i]=A[i],b[i]=B[i];
    for(int x:b[i])s[i].insert(x);
  }
  std::vector<int> p,q;
  for(int i=0;i<n;i++)p.push_back(i);
  for(int i=0;i<m;i++){
    q=p,p.clear();
    for(int x:q)if(s[i].count(c[x+i])&&x+i<n)r[x]++,p.push_back(x);
  }
  p.clear();
  for(int i=0;i<n;i++)p.push_back(i);
  for(int i=0;i<m;i++){
    q=p,p.clear();
    for(int x:q)if(s[m-1-i].count(c[x-i])&&x-i>=0)l[x]++,p.push_back(x);
  }
  const auto upd=[&](int l,int r){
    l=std::max(l,0)+m-1;
    r=std::min(r,n-1);
    if(l<=r)sum[l]++,sum[r+1]--;
  };
  for(int i=0;i<n;i++)upd(i-l[i]+1,i);
  for(int i=0;i<n;i++)upd(i,i+r[i]-1);
  for(int i=0;i+1<n;i++)upd(i-l[i]+1,i+r[i+1]);
  for(int i=1;i<n;i++)sum[i]=sum[i-1]+sum[i];
  build(1,0,n);
  modify(1,0,0);
  for(int i=m;i<=n;i++)if(sum[i-1]){
    modify(1,i,1+query(1,i-m,i-1));
  }
  int ans=query(1,n,n);
  return ans<1e9?ans:-1;
}
#ifdef memset0
int main() {
  freopen("../examples/01.in","r",stdin);
  int N, M, K;
  assert(3 == scanf("%d %d %d", &N, &M, &K));
  
  std::vector<int> C(N);
  for (int i = 0; i < N; ++i) {
    assert(1 == scanf("%d", &C[i]));
  }

  std::vector<int> A(M);
  std::vector<std::vector<int>> B(M);
  for (int i = 0; i < M; ++i) {
    assert(1 == scanf("%d", &A[i]));
    B[i].resize(A[i]);
    for (int j = 0; j < A[i]; ++j) {
      assert(1 == scanf("%d", &B[i][j]));
    }
  }

  int minimum_instructions = minimumInstructions(N, M, K, C, A, B);
  printf("%d\n", minimum_instructions);
  
  return 0;
}
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...