D 95% 求 hack

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define endl "\n"
#define pb push_back
#define be begin()
#define ed end()
#define fi first
#define se second
#define ls i<<1
#define rs i<<1|1
using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
using ull=unsigned long long;
int n,k;
#define N 200010
int a[N],b[N];
struct node{
	int l,r,k;
};
vector<node> vec[N];
vector<int> c[N];
int t[N<<2],mx[N<<2],lz[N<<2];
void pu(int i){
	if(mx[ls]==mx[rs]) mx[i]=mx[ls],t[i]=t[ls]+t[rs];
	else if(mx[ls]>mx[rs]) mx[i]=mx[ls],t[i]=t[ls];
	else mx[i]=mx[rs],t[i]=t[rs];
}
void build(int i,int l,int r){
	mx[i]=0,lz[i]=0;
	if(l==r){
		t[i]=1;return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pu(i);
}
void pd(int i){
	if(lz[i]){
		mx[ls]+=lz[i],lz[ls]+=lz[i];
		mx[rs]+=lz[i],lz[rs]+=lz[i];
		lz[i]=0;
	}
}
void ch(int i,int l,int r,int cl,int cr,int k){
	if(l>cr||r<cl) return;
	if(l>=cl&&r<=cr){
		mx[i]+=k,lz[i]+=k;
		return;
	}
	int mid=(l+r)>>1;
	pd(i);
	ch(ls,l,mid,cl,cr,k),ch(rs,mid+1,r,cl,cr,k);
	pu(i);
}
pii que(int i,int l,int r,int cl,int cr){
	if(l>cr||r<cl) return (pii){0,0};
	if(l>=cl&&r<=cr) return (pii){mx[i],t[i]};
	pd(i);
	int mid=(l+r)>>1;
	auto [mxls,numls]=que(ls,l,mid,cl,cr);
	auto [mxrs,numrs]=que(rs,mid+1,r,cl,cr);
	int mx1,ans;
	if(mxls==mxrs) mx1=mxls,ans=numls+numrs;
	else if(mxls>mxrs) mx1=mxls,ans=numls;
	else mx1=mxrs,ans=numrs;
	pu(i);
	return (pii){mx1,ans};
}
void solve(){
	rep(i,1,n) c[i].clear(),vec[i].clear();
	cin>>n>>k;
	rep(i,1,n) cin>>a[i],b[i]=a[i];
	sort(b+1,b+n+1);
	int tot=unique(b+1,b+n+1)-b-1;
	rep(i,1,n) c[i].pb(0);
	rep(i,1,n){
		a[i]=lower_bound(b+1,b+tot+1,a[i])-b;
		c[a[i]].pb(i);		
	}
	int m=0;
	rep(i,1,n){
		if(c[i].size()==1) continue;
		c[i].pb(n+1);
		m++;
		rep(j,k,(int)c[i].size()-2){
			vec[c[i][j]].pb({c[i][j-k]+1,c[i][j-k+1],1});
			vec[c[i][j+1]].pb({c[i][j-k]+1,c[i][j-k+1],-1});
		}
		rep(j,1,(int)c[i].size()-1){
			int l=c[i][j-1]+1,r=c[i][j]-1;
			if(l<=r){
				vec[l].pb({l,r,1});
				vec[r+1].pb({l,r,-1});
			}
		}
	}
	build(1,1,n);
	ll ans=0;
	rep(i,1,n){
		for(auto [l,r,v]:vec[i]){
			ch(1,1,n,l,r,v);
		}
		auto [mx1,num]=que(1,1,n,1,i);
		if(mx1==m) ans+=num;
	}
	cout<<ans<<endl;
}
int main(){
	IOS
	int t=1; cin>>t;
	while(t--) solve();
	return 0;
}

全部评论
过了TAT
点赞 回复 分享
发布于 2024-08-06 22:18 山东

相关推荐

点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务