zoj 3929 Deque and Balls(需要思考的递推)

思路参考自: http://blog.csdn.net/doris1104/article/details/51126910  thanks

找规律发现  最后一个球和前面球相邻的次数(满足 左边大于右边的)  和 2^ 两个球的间距 有关

        ----->越靠近相邻次数越多。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4
 5 #include<string>
 6 #include<algorithm>
 7 #include<set>
 8 #include<map>
 9 #include<vector>
10 #include<stack>
11 #include<queue>
12 #include<cmath>
13
14 #include<iostream>
15 using namespace std;
16
17 typedef long long ll;
18 const int mod = 1000000007;
19 ll ans[100005],two[100005],num[100005],sum[100005];
20
21 /*
22     num[a] : 用来保存已经出现 a 需要减去的次数
23     num[tmp] = (num[tmp] + two[i-1]) % mod;  越近相邻次数越多,如果两数相同,减去的也越多
24
25      *sum[i] = (sum[i-1] + two[i]) % mod;
26                 情况和
27
28     ans[i] = (2*ans[i-1] + sum[i - 2] - num[tmp] + mod) % mod;
29                  之前的情况和  加上这个的
30               两端都可插入
31                  之前情况*2
32 */
33
34 void init(){
35     two[0] = two[1] = 1;
36     for(int i = 2 ; i < 100005 ; i ++){
37         two[i] = (2*two[i-1])%mod;
38     }
39     sum[0] = 1;
40     for(int i = 1 ; i < 100005 ; i ++){
41         sum[i] = (sum[i-1] + two[i]) % mod;
42     }
43
44 }
45
46 int main(){
47
48     int T;
49     init();
50     scanf("%d",&T);
51     while(T--){
52         int n;
53         scanf("%d",&n);
54         memset(ans,0,sizeof(ans));
55         memset(num,0,sizeof(num));
56         for(int i = 1 ,tmp ; i <= n ; i ++){
57             scanf("%d",&tmp);
58             ans[i] = (2*ans[i-1] + sum[i - 2] - num[tmp] + mod) % mod;
59             num[tmp] = (num[tmp] + two[i-1]) % mod;
60         }
61         printf("%lld\n",(ans[n]*2)%mod);
62     }
63
64     return 0;
65 }
时间: 2024-10-01 03:35:39

zoj 3929 Deque and Balls(需要思考的递推)的相关文章

ZOJ 3929 Deque and Balls

期望=所有情况中总共递减次数*2 放完i个和放完i-1个之间的递减次数是可以递推的. 有一部分是放完i-1个之后产生的,还有一部分是放完第i个之后新产生的. 注意减去多加的部分. 2的i次方可以打个表,然后就再开一个sum预处理2的i次方的前缀和,就可以递推了. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const i

期望+DP ZOJ 3929 Deque and Balls

题目链接 题意:给你n个数,按照顺序依次放入一个双端队列(可放在头部,也可以放在尾部),求xi > xi+1的期望 * 2^n mod (1e9 +7) 分析:期望*2^n=出现这种排法的概率*这种排法的desents数

ZOJ 3690 &amp; HDU 3658 (矩阵快速幂+公式递推)

ZOJ 3690 题意: 有n个人和m个数和一个k,现在每个人可以选择一个数,如果相邻的两个人选择相同的数,那么这个数要大于k 求选择方案数. 思路: 打表推了很久的公式都没推出来什么可行解,好不容易有了想法结果WA到天荒地老也无法AC.. 于是学习了下正规的做法,恍然大悟. 这道题应该用递推 + 矩阵快速幂. 我们设F(n) = 有n个人,第n个人选择的数大于k的方案数: G(n) = 有n个人,第n个人选择的数小于等于k的方案数: 那么递推关系式即是: F(1)=m?k,G(1)=k F(n

[递推dp] zoj 3747 Attack on Titans

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5170 Attack on Titans Time Limit: 2 Seconds      Memory Limit: 65536 KB Over centuries ago, mankind faced a new enemy, the Titans. The difference of power between mankind and their newf

【ZOJ 5689】Deque and Balls(普通dp)

题意:给出一个序列,按照顺序一个一个放入双端队列(可以放在头部也可以放在尾部),一个队列的美丽指数就是数列中a[i]>a[i+1]的个数,求美丽指数的期望*2^n的值. 解题思路:方便起见,我们将a[i]>a[i+1]的情况称为D情况. 由题意可以知道最后得到的序列一共有2^(n-1)个,设ans=所有序列中D情况个数的总和,最后就是求sum/2^(n-1)*2^n = 2*sum 对于将要插入的a[j],sum=原先的D情况总和*2+a[j]产生的D情况-(a[i]=a[j])的情况 如果a

ZOJ-3929 Deque and Balls (DP+找规律)

题目大意:n个数,每个数的大小都在1~n之间.操作n次,第 i 次将第 i 个数放到一个双端队列里面,放到队列两端的概率是相等的.问操作n次之后双端队列中元素满足xi>xi+1的对数的期望,输出的数据为:(期望*2^n)%mod. 题目分析:定义状态dp(i)表示操作 i 次之后的相应期望值.则状态转移方程为: dp(i)=1/2*(dp(i-1)+k1)+1/2*(dp(i-1)+k2)  (两种情况,放在队首和队尾) 其中,k1表示比a(i)小的元素可能与a(i)相邻的总次数,k2表示比a(

ACM学习历程——ZOJ 3822 Domination (2014牡丹江区域赛 D题)(概率,数学递推)

Description Edward is the headmaster of Marjar University. He is enthusiastic about chess and often plays chess with his friends. What's more, he bought a large decorative chessboard with N rows and M columns. Every day after work, Edward will place

POJ 2229 Sumsets(递推,思考)

/* n = 7 1) 1+1+1+1+1+1+1 2) 1+1+1+1+1+2 3) 1+1+1+2+2 4) 1+1+1+4 5) 1+2+2+2 6) 1+2+4 */ /* 若i为偶数 : 若有 1 ,至少有两个 ---->f[i-2]的情况+两个1, 若没有1 , 将偶数分解/2-----> f[i/2]; 则dp[i] = dp[i / 2] + dp[i-2] 若i为奇数: 必定有 1, dp[i] = 减去1的序列,加上1 则dp[i] = dp[i – 1] */ 1 #in

POJ 3090 ZOJ 2777 UVALive 3571 Visible Lattice Points(用递推比用欧拉函数更好)

题目: Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible from the origin if the line from (0, 0) to (x, y) does not pass through any other lattice point. For exa