[USACO11FEB]Generic Cow Protests

题目传送门

一道挺好的数据结构优化DP的题目,树状数组搞一搞就好了。

sol

讲下思路,首先看了眼数据范围 1≤N≤105n平方的可以拿到80pts


所以只要用个前缀和sumi,查询小于等于它的,最后算出的则是答案,就是DP了。

防止RE,离散化一下就欧克了。

cpp

#include<bits/stdc++.h>
#define mod 1000000009
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
int n;
int tree[maxn];
inline int lowbit(int x){return x&(-x);}//树状数组基本操作 
void add(int x,int d){for(int i=x;i<=1e5+10;i+=lowbit(i))tree[i]+=d,tree[i]%=mod;}//添加操作 记得取模 
inline int sum(int x){ll sum=0;for(;x;x-=lowbit(x))sum+=tree[x],sum%=mod;return sum;}//求和操作 记得取模 
int s[maxn],f[maxn];//s为前缀和 
ll ans;
int b[maxn];//离散化数组 
int main(){
	scanf("%d",&n);
	for(int i=1,x;i<=n;i++)scanf("%d",&x),s[i]=s[i-1]+x,b[i]=s[i];//用离散化的数组记录起来 
	sort(b,b+n+1);
	for(int i=0;i<=n;i++)s[i]=lower_bound(b,b+n+1,s[i])-b+1;//离散化 
	add(s[0],1);//s[0]方案数为1 
	for(int i=1;i<=n;i++){
		ans=sum(s[i]);//查询在s[i]前有多少小于等于它的数 
		add(s[i],ans);//加入到树状数组中 
	}
	printf("%lld\n",ans%mod);//记得取模 
	return 0;
}

完结撒花,欢迎大佬爆锤我。

猜你喜欢

转载自www.cnblogs.com/qzwer/p/13196637.html