给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值。

Solution

对于一对 \((i,j), i<j, p[i]<p[j]\),其对 \(k \in (p[i],p[j])\) 有 \(2^{(i-1)+(n-j)}\) 的贡献

于是我们得到了 \(O(n^2 \log n)\) 暴力

考虑枚举左侧的 \(i\),它会与右侧 \(p[j]>p[i]\) 的 \(j\) 对 \([p[i]+1,p[j]-1]\) 之间的 \(k\) 产生相同的贡献 \(2^{i-1}2^{n-j}\),

考虑枚举右侧的 \(j\),它会与左侧 \(p[i]<p[j]\) 的 \(i\) 对 \([p[i]+1,p[j]-1]\) 之间的 \(k\) 产生相同的贡献 \(2^{i-1}2^{n-j}\),

考虑 \(k+1\) 的分与 \(k\) 的分的差值,设为 \(\Delta_k=A_k-A_{k-1}\)

  • 需要减去 \((i,k+1), i<k\)
  • 需要加上 \((k,i), i>k+1\)

从前往后扫描序列,只考虑与当前点位置左边的点成对产生的贡献,(逆向的可以反过来再扫一次),让当前位置作为位置对的右端点 \(j\),贡献为 \(2^{n-j}\)

  • 这个点作为值对中的大者,则 \(j\) 位置前所有小于 \(p[j]\) 的数 \(p[i]\) 会产生 \(-2^{i-1}\) 的贡献
  • 这个点作为值对中的小者,则 \(j\) 位置前所有大于 \(p[j]\) 的数 \(p[i]\) 会产生 \(2^{i-1}\) 的贡献

这个过程显然可以用树状数组维护

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
const int N=1e5+5;
int n,a[N],d[N],m[N],b[N];
int lowbit(int x) {return x&(-x);}
void modify(int x,int v) {
for(;x<=n;x+=lowbit(x)) (b[x]+=v)%=mod;
}
int query(int x) {
int ans=0;
for(;x;x-=lowbit(x)) (ans+=b[x])%=mod;
return ans;
}
signed main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
m[0]=1;
for(int i=1;i<=n;i++) m[i]=(m[i-1]*2)%mod;
for(int i=1;i<=n;i++) {
int v=query(a[i]-1)*m[n-i]%mod;
((d[a[i]]-=v)+=mod)%=mod;
v=(query(n)-query(a[i])+mod)%mod*m[n-i]%mod;
(d[a[i]+1]+=v)%=mod;
modify(a[i],m[i-1]);
}
memset(b,0,sizeof b);
for(int i=n;i>=1;--i) {
int v=(query(n)-query(a[i])+mod)%mod*m[i-1]%mod;
(d[a[i]+1]+=v)%=mod;
v=query(a[i]-1)*m[i-1]%mod;
((d[a[i]]-=v)+=mod)%=mod;
modify(a[i],m[n-i]);
}
for(int i=1;i<=n;i++) {
(d[i]+=d[i-1])%=mod;
cout<<(d[i]+mod)%mod<<endl;
}
}

最新文章

  1. OpenNLP:驾驭文本,分词那些事
  2. redis并发问题
  3. 使用ADO.NET执行SQL脚本
  4. C#基础——谈谈.NET异步编程的演变史
  5. 例题.点击按钮显示内容+弹窗效果+ajax
  6. StringUtils 帮助类所涉及的方法
  7. HTTP 1.1与HTTP 1.0的比较
  8. Baskets of Gold Coins
  9. mysql 常用命令集锦[绝对精华]
  10. [Caffe]史上最全的caffe安装过程
  11. 《阿里巴巴Java开发手册v1.2》解析(编程规约篇)
  12. app后端设计(6)-- LBS
  13. 用H5开发微信还是开发APP?
  14. CodeForces 937C Save Energy! 水题
  15. 唐平中讲座笔记 Reinforcement mechanism design 20171107
  16. manhattan plots in qqplot2
  17. wap2app(六)-- wap2app的原生标题头无法隐藏
  18. NodeJs使用async让代码按顺序串行执行
  19. JavaScript之String总汇
  20. php判断文件存在是用file_exists 还是 is_file

热门文章

  1. asp.net core 3.x 身份验证-2启动阶段的配置
  2. sockaddr与sockaddr_in的关系
  3. appcompat_v7 res values-v21 error
  4. [apue] 书中关于伪终端的一个纰漏
  5. for实例
  6. CCF_201604-4_游戏
  7. POJ_1376_bfs
  8. BZOJ 4556(后缀数组+主席树求前驱后继+二分||后缀数组+二分+可持久化线段树)
  9. 详解c++中对二维数组下标[][]的重载
  10. python如何删除二维或者三维数组/列表中某维的空元素