三指针求调
查看原帖
三指针求调
819004
lostinue楼主2024/1/16 08:29

抽象三指针做法可以过喵 (30pts,感觉算法是对的)

#include<bits/stdc++.h>
#define ll long long
#define debug printf("ciallo\n")
#define rep(i,aaa,bbb) for(int i=(aaa);i<=(bbb);i++)
#define per(i,aaa,bbb) for(int i=(aaa);i>=(bbb);i--)
#define pb push_back
using namespace std;

int read(){
	int f=1,x=0;
	char c=getchar();
	while(c>'9'||c<'0'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x*f;
}

const int inf=0x7fffffff;
const int maxn=1e5+10; 

int n,lm,rm;
int add[maxn];//i---j==a[j]-a[i-1]
//to i,j  add[i]-rm=<add[j]<=add[i]-lm   i=[1,n],j=[0,n-1]
//记录区间和addj,排序,三指针 
int bl[maxn];
int aj[maxn];
int ans;

int main(){
	n=read(),lm=read(),rm=read();
	rep(i,1,n)add[i]=read()+add[i-1];
	rep(i,1,n)bl[i]=add[i];
	rep(i,1,n)aj[i]=add[i-1];
	sort(bl+1,bl+1+n);
	sort(aj+1,aj+1+n);
	int l=1,r=1;
	rep(k,1,n){
		while(r<=n&&aj[k]>=bl[r]-rm)r++;
		while(l<=n&&aj[k]>bl[l]-lm)l++;
		ans+=(r-l);
	}
	printf("%d",ans);
	return 0;
}
2024/1/16 08:29
加载中...