LOADING

加载过慢请开启缓存,浏览器默认开启

daily 2

2023/5/11 daily

CF 552C

给你两个数 m,w,你有w^1 …. w^infinite 个砝码,能否让天平平衡

就是问给你一个m,能不能把其表示为一个w进制数

因为有-1,所以右边只能为0,1,w-1

void solve(){
  int m,w;
  cin>>w>>m;
  while(m){
    if(m%w==0){

    }else if(m%w==1){

    }else if(m%w==(w-1)){
        ++m;
    }
    else{
        cout<<"NO\n";
        return;
    }
    m/=w;
  }
  cout<<"YES\n";
  return;
}

CF 547B

双单调栈,我们可以求出每个数作为最小值可以扩张到哪里,然后更新ans,注意ans[i]是ans[i+1]的子集合,也就是能取到ans[i+1]一定能取到ans[i]

void solve(){
  int n;
  cin>>n;
  vector<int>a(n+1);
  for(int i=1;i<=n;++i){
    cin>>a[i];
  }
  vector<int>l(n+1),r(n+1);
  vector<int>st;
  for(int i=1;i<=n;++i){
    while(st.size()&&a[st.back()]>=a[i])st.pop_back();
    if(!st.size()){
        l[i]=1;
    }else{
        l[i]=st.back()+1;
    }
    st.push_back(i);
  }
  st.clear();
  for(int i=n;i>=1;--i){
    while(st.size()&&a[st.back()]>=a[i])st.pop_back();
    if(!st.size()){
        r[i]=n;
    }else{
        r[i]=st.back()-1;
    }
    st.push_back(i);
  }
  vector<int>ans(n+1);
  for(int i=1;i<=n;++i){
    ans[r[i]-l[i]+1]=max(ans[r[i]-l[i]+1],a[i]);
  }
  for(int i=n-1;i>=1;--i){
    ans[i]=max(ans[i+1],ans[i]);
  }
  for(int i=1;i<=n;++i){
    cout<<ans[i]<<" \n"[i==n];
  }
  return;
}