题目大意

  有一个序列 \(a_1,a_2,\ldots,a_n\),有 \(q\) 次操作,每次操作给你两个数 \(x,y\),你可以交换 \(a_x,a_y\),或者什么都不做。

  问你所有 \(2^q\) 种情况中逆序对的个数之和。

  \(n,q\leq 3000\)

题解

  考虑对于每一对 \(i,j\),计算 \(q\) 次操作后 \(a_i\) 和 \(a_j\) 的大小关系。

  记 \(f_{i,j,k}\) 为操作 \(i\) 次后,\(a_j,a_k\) 这对数中较小的在 \(j\),较大的在 \(k\) 的概率。

  每次操作只会修改 \(O(n)\) 个位置的DP值。

  时间复杂度:\(O(n^2+qn)\)

题解

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<ctime>
  6. #include<functional>
  7. #include<cmath>
  8. #include<vector>
  9. #include<assert.h>
  10. //using namespace std;
  11. using std::min;
  12. using std::max;
  13. using std::swap;
  14. using std::sort;
  15. using std::reverse;
  16. using std::random_shuffle;
  17. using std::lower_bound;
  18. using std::upper_bound;
  19. using std::unique;
  20. using std::vector;
  21. typedef long long ll;
  22. typedef unsigned long long ull;
  23. typedef double db;
  24. typedef std::pair<int,int> pii;
  25. typedef std::pair<ll,ll> pll;
  26. void open(const char *s){
  27. #ifndef ONLINE_JUDGE
  28. char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
  29. #endif
  30. }
  31. void open2(const char *s){
  32. #ifdef DEBUG
  33. char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
  34. #endif
  35. }
  36. int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;}
  37. void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');}
  38. int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;}
  39. int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;}
  40. const int N=3010;
  41. const ll p=1000000007;
  42. ll fp(ll a,ll b)
  43. {
  44. ll s=1;
  45. for(;b;b>>=1,a=a*a%p)
  46. if(b&1)
  47. s=s*a%p;
  48. return s;
  49. }
  50. const ll inv2=fp(2,p-2);
  51. int a[N];
  52. int n,q;
  53. ll f[N][N];
  54. int main()
  55. {
  56. open2("d");
  57. scanf("%d%d",&n,&q);
  58. for(int i=1;i<=n;i++)
  59. scanf("%d",&a[i]);
  60. for(int i=1;i<=n;i++)
  61. for(int j=1;j<=n;j++)
  62. if(a[i]<a[j])
  63. f[i][j]=1;
  64. int x,y;
  65. for(int i=1;i<=q;i++)
  66. {
  67. scanf("%d%d",&x,&y);
  68. f[x][y]=f[y][x]=(f[x][y]+f[y][x])*inv2%p;
  69. for(int j=1;j<=n;j++)
  70. if(j!=x&&j!=y)
  71. {
  72. f[x][j]=f[y][j]=(f[x][j]+f[y][j])*inv2%p;
  73. f[j][x]=f[j][y]=(f[j][x]+f[j][y])*inv2%p;
  74. }
  75. }
  76. ll ans=0;
  77. for(int i=1;i<=n;i++)
  78. for(int j=1;j<i;j++)
  79. ans=(ans+f[i][j])%p;
  80. ans=ans*fp(2,q)%p;
  81. ans=(ans%p+p)%p;
  82. printf("%lld\n",ans);
  83. return 0;
  84. }

【AGC030D】Inversion Sum DP的更多相关文章

  1. 【题解】POJ1934 Trip (DP+记录方案)

    [题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...

  2. 【题解】剪纸条(dp)

    [题解]剪纸条(dp) HRBUST - 1828 网上搜不到题解?那我就来写一篇吧哈哈哈 最优化问题先考虑\(dp\),设\(dp(i)\)表示将前\(i\)个字符(包括\(i\))分割成不相交的回 ...

  3. 【题解】地精部落(DP)

    [题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...

  4. 「AGC030D」Inversion Sum

    「AGC030D」Inversion Sum 传送门 妙啊. 由于逆序对的个数最多只有 \(O(n^2)\) 对,而对于每一个询问与其相关的逆序对数也最多只有 \(O(n)\) 对,我们可以对于每一对 ...

  5. 【LeetCode】129. Sum Root to Leaf Numbers 解题报告(Python)

    [LeetCode]129. Sum Root to Leaf Numbers 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/pr ...

  6. 【CF944G】Coins Exhibition DP+队列

    [CF944G]Coins Exhibition 题意:Jack去年参加了一个珍稀硬币的展览会.Jack记得一共有 $k$ 枚硬币,这些硬币排成一行,从左到右标号为 $1$ 到 $k$ ,每枚硬币是正 ...

  7. 【CF886E】Maximum Element DP

    [CF886E]Maximum Element 题意:小P有一个1-n的序列,他想找到整个序列中最大值的出现位置,但是他觉得O(n)扫一遍太慢了,所以它采用了如下方法: 1.逐个遍历每个元素,如果这个 ...

  8. 【专题】概率期望DP

    11.22:保持更新状态:主要发一些相关的题目和个人理解 (P.S.如果觉得简单,可以直接看后面的题目) upd 11.30 更完了 [NO.1] UVA12230 Crossing Rivers  ...

  9. 【BZOJ-1068】压缩 区间DP

    1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1001  Solved: 615[Submit][Status][ ...

随机推荐

  1. ACCP8.0 HTML标签

    ACCP8.0 HTML标签 第一章1.HTML超文本标记语言2.网页<html></html>3.网页头部<head></head>4.网页标题< ...

  2. Concat

    .net 对List使用Concat newlist=list.Concat(list2).ToList() JS的Concat则不用ToList(),一样要用个值去接 Concat返回是一个新数组, ...

  3. 并发concurrent---3

    背景:并发知识是一个程序员段位升级的体现,同样也是进入BAT的必经之路,有必要把并发知识重新梳理一遍. ConcurrentHashMap:在有了并发的基础知识以后,再来研究concurrent包.普 ...

  4. 1.3 使命的完成者Command

    为什么要从Command说起? 因为Command才是Cesium源码中真正意义的绘制细胞.

  5. node配置微信小程序解密消息以及推送消息

    上一篇文章介绍过 微信小程序配置消息推送,没有看过的可以先去查看一下,这里就直接去把那个客服消息接口去解密那个消息了. 在这里我选择的还是json格式的加密. 也就是给小程序客服消息发送的消息都会被微 ...

  6. DVWA-XSS学习笔记

    DVWA-XSS XSS概念:由于web应用程序对用户的输入过滤不严,通过html注入篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击. XSS类型: 反射型XSS:只是简单地把 ...

  7. windows10远程桌面连接身份验证错误:函数不受支持,这可能是由于 CredSSP 加密 Oracle 修正

    前言:因windows10的更新,最近很多朋友会遇到mstsc远程连接桌面报错: windows10企业版解决方式: 按“win+R”,运行 gpedit.msc, 找:“计算机配置”->“管理 ...

  8. PHP 函数漏洞总结

    1.MD5 compare漏洞 PHP在处理哈希字符串时,会利用"!="或"=="来对哈希值进行比较,它把每一个以"0E"开头的哈希值都解释 ...

  9. wordpress如何利用插件添加优酷土豆等视频到自己的博客上

    wordpress有时候需要添加优酷.土豆等网站的视频到自己的博客上,传统的分享方法不能符合电脑端和手机端屏幕大小的需求,又比较繁琐,怎样利用插件的方法进行添加呢,本视频向你介绍一款这样的插件——Sm ...

  10. 最好用的jQuery-Ajax缓存插件

    AJAX-Cache    最好用的jQuery-Ajax缓存插件 介绍 AJAX-Cache是一款jQuery插件,基于localStorage/sessionStorage实现异步请求缓存功能,并 ...