O(n) but 0
查看原帖
O(n) but 0
370037
_farawaystar_楼主2023/10/8 21:24

看题解区里面都是带log的做法,赛时想出来了一个O(n)的,但是死活调不出来,求调,或者谢谢大佬帮忙指出思路中的谬误

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm> 
#define N 200005
using namespace std;
int n,m,a[N],val[N],nx[N],r1,nr,ans[N],pre[N];//val第x个正数的管辖长度
struct que{
	int l,r,si;
}q[N];
void del(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
}
bool cmp(que a,que b){
	return a.r<b.r;
}
int main(){
	del();
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=n,la=0,v=0;i>=1;i--)
		if(a[i]>0){
			v=a[i];
			la=i;
			val[la]=1;
			nx[i]=i;
		}
		else{
			if(v+a[i]>0){
				v+=a[i];
				val[la]++;
			}
			nx[i]=la;
		}
	for(int i=1;i<=n;i++)pre[i]=pre[i-1]+val[i];
	for(int i=1;i<=m;i++){
		cin>>q[i].l>>q[i].r;
		q[i].si=i;
	}
	sort(q+1,q+m+1,cmp);
	for(int i=1;i<=m;i++){
		while(r1<q[i].r){
			r1++;
			if(a[r1]>0)nr=r1;
		}
		int ll=nx[q[i].l];
		if(nr>=ll&&ll)ans[q[i].si]=pre[nr]-pre[ll]+min(val[ll],ll-q[i].l+1);
		else ans[q[i].si]=0;
	}
	for(int i=1;i<=m;i++)cout<<ans[i]<<endl;
	return 0;
} 
2023/10/8 21:24
加载中...