给定一个全排列,对于它的每一个子序列 \(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;
}
}

Wannafly Winter Camp 2020 Day 7A 序列 - 树状数组的更多相关文章

  1. bzoj4553 [Tjoi2016&Heoi2016]序列 树状数组(区间最大值)+cqd

    [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1006  Solved: 464[Submit][ ...

  2. HDU3887(树dfs序列+树状数组)

    Counting Offspring Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  3. Wannafly挑战赛10F-小H和遗迹【Trie,树状数组】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/72/F 题目大意 \(n\)个字符串,包括小写字母和\(\#\).其中\(\#\)可以替换为任意字符串.求有多 ...

  4. Wannafly Winter Camp 2020 Day 5C Self-Adjusting Segment Tree - 区间dp,线段树

    给定 \(m\) 个询问,每个询问是一个区间 \([l,r]\),你需要通过自由地设定每个节点的 \(mid\),设计一种"自适应线段树",使得在这个线段树上跑这 \(m\) 个区 ...

  5. Wannafly Winter Camp 2020 Day 5I Practice for KD Tree - 二维线段树

    给定一个 \(n \times n\) 矩阵,先进行 \(m_1 \leq 5e4\) 次区间加,再进行 \(m_2 \leq 5e5\) 次询问,每次询问要求输出矩形区间内的最大数.\(n \leq ...

  6. Wannafly Winter Camp 2020 Day 6I 变大! - dp

    给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i ...

  7. Wannafly Winter Camp 2020 Day 6H 异或询问 - 二分

    给定一个长 \(n\) 的序列 \(a_1,\dots,a_n\),定义 \(f(x)\) 为有多少个 \(a_i \leq x\) 有 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\s ...

  8. Wannafly Winter Camp 2020 Day 6D 递增递增 - dp,组合数学

    给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和. Solution 先 ...

  9. Wannafly Winter Camp 2020 Day 6C 酒馆战棋 - 贪心

    你方有 \(n\) 个人,攻击力和血量都是 \(1\).对方有 \(a\) 个普通人, \(b\) 个只有盾的,\(c\) 个只有嘲讽的,\(d\) 个有盾又有嘲讽的,他们的攻击力和血量都是无穷大.有 ...

随机推荐

  1. 二、UDP

    1 端口号 在计算机网络和电磁信号理论中,对共享同一通信信道的多个信号进行区分是个常见的问题.多路复用(multiplexing)就是允许多个会话共享同一介质或机制的一种解决方案. 使用不同的频率来区 ...

  2. 01背包与完全背包(dp复习)

    01背包和完全背包都是dp入门的经典,我的dp学的十分的水,借此更新博客的机会回顾一下 01背包:给定总容量为maxv的背包,有n件物品,第i件物品的的体积为w[i],价值为v[i],问如何选取才能是 ...

  3. Codeforces_801

    A.直接暴力就行了,先把能组合的按线性组合掉,再枚举剩下相邻没用过的. #include<bits/stdc++.h> using namespace std; string s; ] = ...

  4. ARTS Week 7

    Dec 9, 2019 ~ Dec 15, 2019 Algorithm Problem 38.Count And Say 外观数列 题目链接 题目描述: 外观数列 是一个整数序列,从数字 1 开始, ...

  5. How to check sqlsever table data type identity status ?

    Unlike in Oracle, sqlserver has an special data type in order by make identity growth. But what abou ...

  6. 01-Maven

    今日知识 1. Maven 2. 依赖管理 2. 项目构建 Maven 1. Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 2. Ma ...

  7. Spring Bean几种注入方式——setter(常用),构造器,注入内部Bean,注入集合,接口...

    依赖注入分为三种方式: 1.1构造器注入 构造器通过构造方法实现,构造方法有无参数都可以.在大部分情况下我们都是通过类的构造器来创建对象,Spring也可以采用反射机制通过构造器完成注入,这就是构造器 ...

  8. 广西Ukey登录需求

    1.前端控制浏览器用户安装证书[1.检测,2,提示用户强制安装] JITComVCTK_S.exe 2.前端调用接口获取认证原文 3.对前端认证原文处理,提交请求到后端 摘算法处理后的认证原文 认证原 ...

  9. 利用MySQL之federated引擎实现DBLink功能

    有时候我们需要跨库join查询,但是配置多数据源成本又太高,Oracle提供了DBLink功能,MySQL中也有类似的实现:federated-engine. MySQL中使用federated引擎的 ...

  10. 从零构建Flink SQL计算平台 - 1平台搭建

    一.理想与现实 Apache Flink 是一个分布式流批一体化的开源平台.Flink 的核心是一个提供数据分发.通信以及自动容错的流计算引擎.Flink 在流计算之上构建批处理,并且原生的支持迭代计 ...