80分求调
查看原帖
80分求调
983702
lrj3247楼主2024/12/8 22:04

顺便问一下-代码能力菜,然后多练,但多练又因为代码能力菜而天天调代码耽误时间这个死循环该怎么跳出。(每次写代码思路都放清晰了的,就是在一些奇奇怪怪的地方犯错误,一调就是几个小时)

#include <bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define int long long
#define ll long long
using namespace std;
inline int read(){
	int w = 0 , f = 1;
	char ch = getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while('0'<=ch&&ch<='9'){
		w=w*10+(ch-'0');
		ch=getchar();
	}
	return w*f;
}
const int N = 1e5+15,MOD=1e9+9;
int n,a[N];
ll sum[N],dp[N],b[N];
struct BIT{
	ll tr[N];
	BIT(){
		memset(tr,0,sizeof(tr));
	}
	void change(int x,ll k){
		for(int i = x ; i<=n ; i+=lowbit(i)){
			tr[i]+=k;
			tr[i]%=MOD;
		}
		return ;
	}
	ll query(int x){
		ll sum = 0;
		for(int i = x ; i>0 ; i-=lowbit(i)){
			sum+=tr[i];
			sum%=MOD;
		}
		return sum;
	}
}T;
signed main(){
	n = read();
	for(int i = 1 ; i<=n ; i++){
		a[i]=read();
		sum[i]=sum[i-1]+a[i];
		b[i]=sum[i];
	}
	b[n+1]=0;
	sort(b+1,b+n+2);
	int m = unique(b+1,b+n+2) - b - 1;
	for(int i = 1 ; i<=n+1 ; i++){
		sum[i]=upper_bound(b+1,b+m+1,sum[i]) - b;
	}
	T.change(sum[n+1],1);
	for(int i = 1 ; i<=n ; i++){
		dp[i]=T.query(sum[i]);
		T.change(sum[i],dp[i]);
	}
	cout<<dp[n];
	return 0;
}
2024/12/8 22:04
加载中...