2 solutions

  • 0
    @ 2025-6-7 22:09:32

    #include<bits/stdc++.h> using namespace std; typedef long long ll;

    const int N=1e6+5; int n,k,a[N],st[20][N]; vector pos[N]; int qry(int l,int r){ int o=__lg(r-l+1); return max(st[o][l],st[o][r-(1<<o)+1]); }

    void solve(){ cin>>n>>k; for(int i=1;i<=n;++i)cin>>a[i],pos[a[i]].push_back(i),st[0][i]=a[i]; for(int i=1;1<<i<=n;++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)]); ll ans=0; for(int i=1;i<=n;++i){ for(int j=0;j+k-1<pos[i].size();++j){ int lp=pos[i][j],rp=pos[i][j+k-1]; if(qry(lp,rp)>i)continue; int l=j?pos[i][j-1]+1:1,r=lp,mid,L=lp,R=rp; while(l<=r){ mid=(l+r)>>1; if(qry(mid,lp)==i)r=mid-1,L=mid; else l=mid+1; } l=rp,r=n; while(l<=r){ mid=(l+r)>>1; if(qry(rp,mid)==i)l=mid+1,R=mid; else r=mid-1; } ans+=1ll*(lp-L+1)*(R-rp+1); } } cout<<ans<<'\n'; for(int i=1;i<=n;++i)pos[i].clear(); }

    int main(){ ios::sync_with_stdio(0);cin.tie(0); int T = 1; //cin>>T; while(T--)solve(); }

    • -1
      @ 2025-5-20 22:12:29

      预处理每个值的所有出现位置 Ci,j C_{i,j}

      首先枚举最大值 xx 和第一次出现的位置 Cx,i C_{x,i}, ,则它第 kk 次出现的位置为 Cx,i+k1C_{x,i+k-1}

      二分子列左端点的最左位置 LL 和右端点 RR 的最右位置 分别需要满足 max(a[LCx,i])=xmax(a[L\dots C_{x,i}]) = x , max(a[Cx,i+k1R])=xmax(a[C_{x,i+k-1}\dots R]) = x 。区间 maxmax 可以用stst

      #include<bits/stdc++.h>
      using namespace std;
      typedef long long ll;
       
      const int N=1e6+5;
      int n,k,a[N],st[20][N];
      vector<int> pos[N];
      int qry(int l,int r){
          int o=__lg(r-l+1);
          return max(st[o][l],st[o][r-(1<<o)+1]);
      }
       
      void solve(){
          cin>>n>>k;
          for(int i=1;i<=n;++i)cin>>a[i],pos[a[i]].push_back(i),st[0][i]=a[i];
          for(int i=1;1<<i<=n;++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)]);
          ll ans=0;
          for(int i=1;i<=n;++i){
              for(int j=0;j+k-1<pos[i].size();++j){
                  int lp=pos[i][j],rp=pos[i][j+k-1];
                  if(qry(lp,rp)>i)continue;
                  int l=j?pos[i][j-1]+1:1,r=lp,mid,L=lp,R=rp;
                  while(l<=r){
                      mid=(l+r)>>1;
                      if(qry(mid,lp)==i)r=mid-1,L=mid;
                      else l=mid+1;
                  }
                  l=rp,r=n;
                  while(l<=r){
                      mid=(l+r)>>1;
                      if(qry(rp,mid)==i)l=mid+1,R=mid;
                      else r=mid-1;
                  }
                  ans+=1ll*(lp-L+1)*(R-rp+1);
              }
          }
          cout<<ans<<'\n';
          for(int i=1;i<=n;++i)pos[i].clear();
      }
       
      int main(){
          ios::sync_with_stdio(0);cin.tie(0);
          int T = 1;
          //cin>>T;
          while(T--)solve();
      }
      
      • 1

      Information

      ID
      1482
      Time
      2000ms
      Memory
      256MiB
      Difficulty
      7
      Tags
      (None)
      # Submissions
      44
      Accepted
      9
      Uploaded By