AGC 030D.Inversion Sum(DP 期望)
\(Description\)
给定长为\(n\)的序列\(A_i\)和\(q\)次操作\((x,y)\)。对于每次操作\((x,y)\),可以选择交换\(A_x,A_y\)两个数,也可以选择不进行操作。求所有\(2^q\)种情况中,逆序对个数之和。
\(n,q\leq3000\)。
\(Solution\)
不去直接求和,我们求\(q\)次操作后逆序对的期望个数。这样乘上\(2^q\)就是答案。
可以令\(f[t][i][j]\)表示,\(t\)次操作后,\(A_i<A_j\)的概率。
\(f[0][i][j]\)可以由初始序列得到,然后可以从\(f[t-1][i][j]\)转移到\(f[t][i][j]\),但这样好像是\(O(n^2q)\)的?
对于每次操作\((x,y)\),只会影响\(i\)或\(j\)等于\(x\)或\(y\)时的\(f[t][i][j]\),其它的都不会变。所以只需要修改这\(O(n)\)个值就可以了。(比如\(f[i][x]\)即\(a_i<a_x\)的概率,现在\(\frac12\)会变成\(a_i<a_y\)的概率,即\(f[i][x]=\frac{f[i][x]+f[i][y]}{2}\),\(f[i][y]\)同理)
复杂度\(O(n^2+qn)\)。
话说Um_nik是什么写法啊。。。
//310ms 35456KB
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define mod 1000000007
#define inv2 500000004ll
typedef long long LL;
const int N=3005;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline int FP(int x,int k)
{
int t=1;
for(; k; k>>=1,x=1ll*x*x%mod)
if(k&1) t=1ll*t*x%mod;
return t;
}
int main()
{
static int A[N],f[N][N];
const int n=read(),q=read();
for(int i=1; i<=n; ++i) A[i]=read();
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j) f[i][j]=A[i]<A[j];
for(int i=1; i<=q; ++i)
{
int x=read(),y=read();
f[x][y]=f[y][x]=inv2*(f[x][y]+f[y][x])%mod;
for(int j=1; j<=n; ++j)
if(j!=x && j!=y)
f[j][x]=f[j][y]=inv2*(f[j][x]+f[j][y])%mod,
f[x][j]=f[y][j]=inv2*(f[x][j]+f[y][j])%mod;
}
LL ans=0;
for(int i=1; i<=n; ++i)
for(int j=1; j<i; ++j) ans+=f[i][j];
printf("%lld\n",ans%mod*FP(2,q)%mod);
return 0;
}
AGC 030D.Inversion Sum(DP 期望)的更多相关文章
- 【AGC030D】Inversion Sum DP
题目大意 有一个序列 \(a_1,a_2,\ldots,a_n\),有 \(q\) 次操作,每次操作给你两个数 \(x,y\),你可以交换 \(a_x,a_y\),或者什么都不做. 问你所有 \(2^ ...
- CF258D Little Elephant and Broken Sorting/AGC030D Inversion Sum 期望、DP
传送门--Codeforces 传送门--Atcoder 考虑逆序对的产生条件,是存在两个数\(i,j\)满足\(i < j,a_i > a_j\) 故设\(dp_{i,j}\)表示\(a ...
- 概率dp+期望dp 题目列表(一)
表示对概率和期望还不是很清楚定义. 目前暂时只知道概率正推,期望逆推,然后概率*某个数值=期望. 为什么期望是逆推的,例如你求到某一个点的概率我们可以求得,然后我们只要运用dp从1~n每次都加下去就好 ...
- 「AGC030D」Inversion Sum
「AGC030D」Inversion Sum 传送门 妙啊. 由于逆序对的个数最多只有 \(O(n^2)\) 对,而对于每一个询问与其相关的逆序对数也最多只有 \(O(n)\) 对,我们可以对于每一对 ...
- [CF697D]Puzzles 树形dp/期望dp
Problem Puzzles 题目大意 给一棵树,dfs时随机等概率选择走子树,求期望时间戳. Solution 一个非常简单的树形dp?期望dp.推导出来转移式就非常简单了. 在经过分析以后,我们 ...
- Max Sum(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others) ...
- HDOJ(HDU).1003 Max Sum (DP)
HDOJ(HDU).1003 Max Sum (DP) 点我挑战题目 算法学习-–动态规划初探 题意分析 给出一段数字序列,求出最大连续子段和.典型的动态规划问题. 用数组a表示存储的数字序列,sum ...
- Problem Arrangement ZOJ - 3777(状压dp + 期望)
ZOJ - 3777 就是一个入门状压dp期望 dp[i][j] 当前状态为i,分数为j时的情况数然后看代码 有注释 #include <iostream> #include <cs ...
- 2017 ICPC Asia Urumqi A.coins (概率DP + 期望)
题目链接:Coins Description Alice and Bob are playing a simple game. They line up a row of nn identical c ...
随机推荐
- CTPN项目部分代码学习
上次拜读了CTPN论文,趁热打铁,今天就从网上找到CTPN 的tensorflow代码实现一下,这里放出大佬的github项目地址:https://github.com/eragonruan/text ...
- 没有-jackson相关依赖会抛出如下异常--------在spring官方文档有解释
<!--jackson相关依赖--><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackso ...
- @ResponseBody//该注解会将返回值转为json格式并放到响应体中返回到前台
- SQL Server表关联
表关联:Hash.Nested Loops.Merge.这是实际算法,不是T-SQL中的inner/left/right/full/cross join.优化器会把这些T-SQL写法转换成上面的3种算 ...
- 函数select、poll
函数select select函数: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct ...
- MyBatis - 1.入门
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyBatis可以使用简单的XML或注解 ...
- asp.net Web API 身份验证 不记名令牌验证 Bearer Token Authentication 简单实现
1. Startup.Auth.cs文件 添加属性 1 public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; ...
- jQuery中live函数的替代-【jQuery】
在老版本的jQuery中,当需要对页面上某个由ajax加载的某片段的页面内容响应事件时,可以使用live函数来响应其事件,比如: $('a').live('click', function() { b ...
- 集群LVS
集群分为LB负载均衡集群,HA高可用集群,LB高应用集群. 前两种比较常见 LB是更加注重性能处理速度,而HA注重是服务器的在线时间. HA集群一般设有主重,当主服务器当掉时候,重服务器进行工作,此时 ...
- 利用Jmeter做接口测试的时候,如何提取头部的JSESSIONID然后传递到下一个请求,继续完成当前用户的请求。
其实,关于这个问题有三种种解决方法: 1)从响应数据里面提取JSESSIONID,点击链接可以查看https://www.cnblogs.com/liulinghua90/p/5320290.html ...