P2344 奶牛抗议
P2344 奶牛抗議
題目背景
Generic Cow Protests, 2011 Feb
題目描述
約翰家的N 頭奶牛正在排隊游行抗議。一些奶牛情緒激動,約翰測算下來,排在第i 位的奶牛的理智度為Ai,數字可正可負。
約翰希望奶牛在抗議時保持理性,為此,他打算將這條隊伍分割成幾個小組,每個抗議小組的理智度之和必須大于或等于零。奶牛的隊伍已經固定了前后順序,所以不能交換它們的位置,所以分在一個小組里的奶牛必須是連續位置的。除此之外,分組多少組,每組分多少奶牛,都沒有限制。
約翰想知道有多少種分組的方案,由于答案可能很大,只要輸出答案除以1000000009 的余數即可。
輸入輸出格式
輸入格式:?
? 第一行:單個整數N,1 ≤ N ≤ 100000
? 第二行到第N + 1 行:第i + 1 行有一個整數Ai,?10^5 ≤ Ai ≤ 10^5
?
輸出格式:?
單個整數:表示分組方案數模1000000009 的余數
?
輸入輸出樣例
輸入樣例#1:4 2 3 -3 1 輸出樣例#1:
4
說明
解釋:如果分兩組,可以把前三頭分在一組,或把后三頭分在一組;如果分三組,可以把中間兩頭分在一組,第一和最后一頭奶牛自成一組;最后一種分法是把四頭奶牛分在同一組里。
?
離散化+樹狀數組,
f[i] 為到第 i 只奶牛有幾種分組
f[i]=∑j?f[j](Sum[i]>=Sum[j])
f[i] = 所有的sum[j](s[j]<=sum[i]),將所有小于sum[i]的所有sum[j]加起來,每次需要把f[i]插入到樹狀數組中,所以樹狀數組剛好可以維護。
注意I64d與lld的使用。首先將f[0]插入,f[0] = 1;
1 #include<cstdio> 2 #include<algorithm> 3 #define LL long long 4 5 using namespace std; 6 const int MAXN = 100100; 7 const int mod = 1000000009 ; 8 struct Cow{ 9 LL sum; 10 int p; 11 bool operator < (const Cow &a) const 12 { 13 return sum < a.sum; 14 } 15 }a[MAXN]; 16 int p[MAXN],n; 17 LL sum[MAXN]; 18 int lowbit(int x) 19 { 20 return x&(-x); 21 } 22 void update(int x,LL w) 23 { 24 while (x<=n) 25 { 26 sum[x] = (sum[x]+w)%mod; 27 x += lowbit(x); 28 } 29 } 30 LL query(int x) 31 { 32 LL ans = 0; 33 while (x) 34 { 35 ans = (ans+sum[x])%mod; 36 x -= lowbit(x); 37 } 38 return ans; 39 } 40 int main() 41 { 42 scanf("%d",&n); 43 for (int i=1; i<=n; ++i) 44 { 45 LL w; 46 scanf("%lld",&w); 47 a[i].sum = a[i-1].sum + w; 48 a[i].p = i; 49 } 50 a[n+1].sum = 0; 51 a[n+1].p = n+1; 52 sort(a+1,a+n+2); 53 int num = 0; 54 for (int i=1; i<=n+1; ++i) 55 { 56 if (i==1||a[i].sum!=a[i-1].sum) ++num; 57 p[a[i].p] = num; 58 } 59 update(p[n+1],1); 60 LL tmp = 0; 61 for (int i=1; i<=n; ++i) 62 { 63 tmp = query(p[i]); 64 update(p[i],tmp); 65 } 66 printf("%lld",tmp); 67 return 0; 68 }轉載于:https://www.cnblogs.com/mjtcn/p/7099844.html
總結
以上是生活随笔為你收集整理的P2344 奶牛抗议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IP协议解读(三)
- 下一篇: Android 开发笔记___初级控件之