[传智杯 #2 决赛] 课程安排
这是一篇清真的 two-pointer 题解。好想也好写,并且不需要用到其他的奇奇怪怪的东西。
先不考虑
接着考虑限制
具体实现可以看看代码帮助理解。
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=5e5+10;
int T,n,l,r,a[N],cnt[N];
void solve() {
scanf("%d%d",&n,&l);ll res1=0,res2=0;
for(int i=1;i<=n;i++) scanf("%d",&a[i]),cnt[i]=0;
r=0;
for(int i=1;i<=n;i++) {
if(i>r) r++,cnt[a[r]]++;
while(r<n&&a[r]!=a[r+1]) ++r,++cnt[a[r]];
--cnt[a[i]];
res1+=r-i+1-cnt[a[i]];
}
r=0;
for(int i=1;i<=n;i++) {
if(i>r) ++r,cnt[a[r]]++;
while(r<n&&a[r]!=a[r+1]&&r+1-i+1<l) ++r,++cnt[a[r]];
--cnt[a[i]];
res2+=r-i+1-cnt[a[i]];
}
printf("%lld\n",res1-res2);
}
int main() {
scanf("%d",&T);
while(T--) solve();
return 0;
}