给定一个全排列,对于它的每一个子序列 \(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. android webview正确显示音标

    package com.example.fonttest; import android.support.v7.app.ActionBarActivity; import android.webkit ...

  2. Jumpserver:跳板机

    简介 jumpserver是github上的一个开源项目,其能有效的对服务器.用户进行分组,实现用户-系统用户-服务器的对应权限控制,并结合审计.日志等功能,据说是 4A 级的专业运维审计系统,系统提 ...

  3. centos 7安装reids

    一.reids下载  下载地址: https://redis.io/ 二.解压安装 ① 解压:tar -zxvf redis-5.0.5.tar.gz ② 安装环境:yum install gcc-c ...

  4. numpy 介绍与使用

    一.介绍 中文文档:https://www.numpy.org.cn/ NumPy是Python语言的一个扩展包.支持多维数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.NumPy提供了与Ma ...

  5. JavaScript中,数组和对象的遍历方法总结

    循环遍历是写程序很频繁的操作,JavaScript 提供了很多方法来实现. 这篇文章将分别总结数组和对象的遍历方法,新手可以通过本文串联起学过的知识. 数组遍历 方法一:for 循环 for 循环是使 ...

  6. 国内jenkins搭建不再龟速的方式

    最新国内jenkisn搭建过程 第一步下载jenkins 点击进入清华源jenkins下载地址,我们下载的是jenkins-2.204.2.zip版本 之后解压后安装. 第二步配置管理员密码 自动弹出 ...

  7. Xcode如何集成Pod教程

    一般开发都会用到很多第三方的框架,利用好他们可以加快开发进度,为了更方便将第三方的框架集成到我们的项目中,Pod是个很好的选择,现在说一下该怎么将Pod集成到我们的Xcode中 第一种方法 命令行的方 ...

  8. Java的开发—面向对象的7大原则之开闭原则(一)

    开闭原则(Open Close Principle) 一.定义: 软件中的(类.模块.函数等等)应该对于扩展是开放的,对于修改时关闭的.意味着一个实体允许在不改变它的源代码的前提变更它的行为 这里的软 ...

  9. codewars--js--Range Extraction

    问题描述: A format for expressing an ordered list of integers is to use a comma separated list of either ...

  10. VSTO开发指南(VB2013版) 第四章 Excel编程

    实例1:处理NewWorkbook和WorkSheet事件的控制台程序 书本第70页 程序清单 4.1 处理NewWorkbook和WorkSheet事件的控制台程序 Imports Excel = ...