codeforces#1167F. Scalar Queries(树状数组+求贡献)
题目链接:
https://codeforces.com/contest/1167/problem/F
题意:
给出长度为$n$的数组,初始每个元素为$a_i$
定义:$f(l, r)$为,重排$l$到$r$的元素,变成长度为$(r-l+1)$的数组$b_i$,$f(l, r)=\sum\limits_{i = 1}^{r - l + 1}{b_i \cdot i}$
求$\left(\sum\limits_{1 \le l \le r \le n}{f(l, r)}\right) \mod (10^9+7)$
数据范围:
$1 \le n \le 5 \cdot 10^5$
$1 \le a_i \le 10^9$
$a_i\neq a_j,for,i\neq j$
分析:
把问题转化为求$a_i$对答案贡献的系数$x_i$
即:$ ans=x[1]\times a[1]+x[2]\times a[2]+x[3]\times a[3]+...$
只有$l\leq i\leq r$的时候,$a_i$才对答案有影响
如果$(l,r)$有$y$个数小于等于$a_i$,那么$x_i = x_i+y$
用树状数组计算$a_i$前面的数和后面的数对$x_i$的影响
ac代码:
#include<bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
using namespace std;
const int maxn=5e5+10;
const ll mod=1e9+7;
int n,t[maxn],num[maxn];
map<int,int>ma;
ll zz[maxn],tree[maxn];
void add(int x,int y)
{
for(int i=x;i<=n;i+=(i&(-i)))tree[i]+=y;
}
ll quer(int x)
{
ll res=0;
for(int i=x;i;i-=(i&(-i)))res+=tree[i];
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
t[i]=num[i];
}
sort(t+1,t+n+1);//离散化处理
for(int i=1;i<=n;i++)
ma[t[i]]=i;
for(int i=1;i<=n;i++)
{
zz[i]=quer(ma[num[i]])*(n-i+1)%mod;//前面的数对zz[i]的贡献
add(ma[num[i]],i);
}
for(int i=1;i<=n;i++)
tree[i]=0;
for(int i=n;i>=1;i--)
{
zz[i]=(zz[i]+quer(ma[num[i]])*i%mod)%mod;//后面的数对zz[i]的贡献
add(ma[num[i]],n-i+1);
zz[i]=(zz[i]+(ll)(n-i+1)*i%mod)%mod;//num[i]对zz[i]的贡献
}
ll ans=0;
for(int i=1;i<=n;i++)
ans=(ans+(ll)num[i]*zz[i]%mod)%mod;
printf("%lld\n",ans);
return 0;
}
codeforces#1167F. Scalar Queries(树状数组+求贡献)的更多相关文章
- [Codeforces 1208D]Restore Permutation (树状数组)
[Codeforces 1208D]Restore Permutation (树状数组) 题面 有一个长度为n的排列a.对于每个元素i,\(s_i\)表示\(\sum_{j=1,a_j<a_i} ...
- Codeforces 650D - Zip-line(树状数组)
Codeforces 题目传送门 & 洛谷题目传送门 我怕不是个 nt--一开始忽略了"询问独立"这个条件--然后就一直在想有什么办法维护全局 LIS--心态爆炸 首先离散 ...
- HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
- UVA11525 Permutation[康托展开 树状数组求第k小值]
UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...
- 树状数组求第k小的元素
int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ...
- POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)
树状数组求逆序对 转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...
- hdu 4217 Data Structure? 树状数组求第K小
Data Structure? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- poj 2985 The k-th Largest Group 树状数组求第K大
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8353 Accepted ...
随机推荐
- k8s之网络插件flannel及基于Calico的网络策略
1.k8s网络通信 a.容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现; b.pod之间的通信:pod ip <---> pod ip,pod和pod之间不经过任何转换即可 ...
- MySQL 聚合函数(三)MySQL对GROUP BY的处理
原文来自MySQL 5.7 官方手册:12.20.3 MySQL Handling of GROUP BY SQL-92和更早版本不允许SELECT列表,HAVING条件或ORDER BY列表引用未在 ...
- Linux 创建用户 用户组 用户权限
首先 你要有个root账号 然后才能做下面几条操作: useradd username 创建用户usernamepasswd user_pwd 给已创建的用户username设置密码 关于us ...
- Css文字在div中自动换行
Css文字在div中自动换行 word-break:break-all; 文字在div中字段换行
- 关于windows下编写的shell脚本在linux下无法运行报错问题
首先,你写的shell脚本必须是正确的, 其次,无法运行的原因:因为windows下的换行是两个字节,而你上传到linux,linux下换行是两个字节,所以编译的酒不正确的,导致无法 运行脚本, 这种 ...
- struts 漏洞
安装shop++ 安装成功 访问 http://127.0.0.1:8080 即网站首页 访问 http://127.0.0.1:8080/admin 即网站后台
- 数学模块 math 函数的调用
数学模块 math 模块名: math 注: linux下为内建模块 Mac OS下为标准库模块 数学模块用法: import math # 或 from math import * 数据 描述 ma ...
- 三、DQL语言
目录 一.基础查询 (一)语法 (二)特点 (三)示例 二.条件查询 (一)语法 (二)筛选条件的分类 三.排序查询 (一)语法 (二)特点 四.常见函数 (一)介绍 (二)分类 五.单行函数 (一) ...
- 关于postgres数据库部署之后,发现不能被外机连接解决办法
数据库 部署完毕之后,用其他机器的navcat连接发现不能连接,如下报错信息 于是在数据库服务器上查询是否启动正常,端口是否正常,发现都没有问题,由于之前也遇到了mysql部署之后,不能被其他机器访问 ...
- <meta http-equiv="X-UA-Compatible" content="IE=edge">详解
X-UA-Compatible是针对IE8新加的一个设置,对于IE8之外的浏览器是不识别的. 这个区别与content="IE=7"在无论页面是否包含<!DOCTYPE> ...