题目大意: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(i)大的元素可能与a(i)相邻的总次数。

合并一下得到:dp(i)=dp(i-1)+(k1+k2)/2 ,因为输出的数据为 “(期望*2^n)%mod”,所以,改变dp(i)的含义为如果操作 i 次要输出的结果,则:

dp(i)=2*dp(i-1)+k1+k2=2*dp(i-1)+k(i-1)-num(a(i)),其中,k(i-1)表示前i-1个数与第 i 个数相邻的可能总次数,num(a(i))表示到目前为止与a(i)相等的元素可能与a(i)相邻的总次数。

有个规律能够快速的求出k(i)和num(a(i))。假如当前在进行第 i 次操作,那么第1、第2、第3...元素可能与a(i)相邻的次数为1、1、2、4、8...

只需将上述规律要出表f,就能快速查找k(i)和num(a(i))以及更新num(a(i))。

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<vector>
# include<queue>
# include<list>
# include<set>
# include<map>
# include<string>
# include<cmath>
# include<cstdlib>
# include<algorithm>
using namespace std;
# define LL long long const int N=1005;
const int INF=1000000000;
const LL oo=0x7fffffffffffffff;
const double eps=1e-10;
const int mod=1000000007; int n;
LL sum[N*100];
LL f[N*100];
LL dp[N*100];
LL num[N*100]; void init()
{
f[0]=f[1]=1;
for(int i=2;i<=100000;++i)
f[i]=(2*f[i-1])%mod;
sum[0]=1;
for(int i=1;i<=100000;++i)
sum[i]=(f[i]+sum[i-1])%mod;
} int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(num,0,sizeof(num));
memset(dp,0,sizeof(dp));
LL a;
scanf("%lld",&a);
dp[1]=0;
num[a]=f[0]%mod;
for(int i=2;i<=n;++i){
scanf("%lld",&a);
dp[i]=(2*dp[i-1]+sum[i-2]-num[a]+mod)%mod;
num[a]=(num[a]+f[i-1])%mod;
}
printf("%lld\n",(dp[n]*2)%mod);
}
return 0;
}

  

ZOJ-3929 Deque and Balls (DP+找规律)的更多相关文章

  1. 期望+DP ZOJ 3929 Deque and Balls

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

  2. ZOJ 3929 Deque and Balls

    答案=所有情况中总共递减次数*2 放完i个和放完i-1个之间的递减次数是可以递推的. 有一部分是放完i-1个之后产生的,还有一部分是放完第i个之后新产生的. 注意减去多加的部分. 2的i次方可以打个表 ...

  3. [FJOI2007]轮状病毒 题解(dp(找规律)+高精度)

    [FJOI2007]轮状病毒 题解(dp(找规律)+高精度) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1335733 没什么好说的,直接把规律找出来,有 ...

  4. ZOJ 3622 Magic Number 打表找规律

    A - Magic Number Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Subm ...

  5. HDU 1028 Ignatius and the Princess III (母函数或者dp,找规律,)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  6. hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!

    http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE,  更重要的是找出规律后,O(n)递推也过不了,TLE,一定 ...

  7. ZOJ 3932 Deque and Balls

    There are n balls, where the i-th ball is labeled as pi. You are going to put n balls into a deque. ...

  8. loj6172 Samjia和大树(树形DP+找规律)

    题目: https://loj.ac/problem/6172 分析: 首先容易得出这样的dp式子 然后发现后面那个Σ其实是两段区间,可以用总和减去中间一段区间表示,所以只要维护个前缀和就ok了 这样 ...

  9. LightOJ 1323 Billiard Balls(找规律(蚂蚁爬木棍))

    题目链接:https://vjudge.net/contest/28079#problem/M 题目大意: 一个边界长为L宽为W的平面同时发射n个台球,运动K秒,台球碰到桌面及两(多)个台球相撞情况如 ...

随机推荐

  1. Oracle创建用户并给用户授权查询指定表或视图的权限

    MSV31账户登录数据库进行如下操作: CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND  DEFAULT TABLESPACE "TBS_DN ...

  2. RPI学习--环境搭建_默认启动桌面/终端修改

    参见:http://elinux.org/RPi_raspi-config 首次运行Raspbian会自动进入设置,往后也可以重新进入设置: $ sudo raspi-config 选项3 Enabl ...

  3. JS获取上传文件的名称、格式、大小

    <input id="File1" type="file" onchange="checkFile(this)" /> 方式一) ...

  4. android开机启动过程

    Android系统开机主要经历三个阶段: bootloader启动 Linux启动 Android启动 启动文件: 对于机器从通电到加载Linux系统一般需要三个文件:bootloader(引导文件) ...

  5. poj1837 dp

    //Accepted 2176 KB 47 ms //杠杆平横的条件:sum(c[i]*sum(g[j]))=0 // 所有的hook到原点的距离乘它上面挂着的物体的重量和的和为0 //对于一个hoo ...

  6. java 集合归类

    对java的集合一直是停留在使用的角度,没有进行系统的归纳,趁现在比较空闲,归纳一下. 1  集合的层次关系 最顶层的有三个集合,其中一个类,两个接口, 一个类是Arrays,两个接口是Collect ...

  7. JSP如何在servlet将一个数据模型对象传递给jsp页面

    在servlet把对象放到request里,然后jsp里直接通过request取值如 在servlet:(简写了)public void doGet(request,response){UserInf ...

  8. Linux Mint下安装JDK

    Linux Mint 17下安装的是默认的OpenJDK,可以使用java -version查看 现在需要使用Sun/Oracle官方的JDK:http://www.oracle.com/techne ...

  9. .a包生成64位

    ./configure  CC="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain ...

  10. HDU 5040

    http://acm.hdu.edu.cn/showproblem.php?pid=5040 题意比较难懂,有摄像头的位置是可以走的,每回合开始看做人先走摄像头再转,也就是说如果你这回合走之前没有摄像 ...