题目链接:

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代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define pa pair<int,int>
  4. using namespace std;
  5. const int maxn=5e5+10;
  6. const ll mod=1e9+7;
  7. int n,t[maxn],num[maxn];
  8. map<int,int>ma;
  9. ll zz[maxn],tree[maxn];
  10. void add(int x,int y)
  11. {
  12. for(int i=x;i<=n;i+=(i&(-i)))tree[i]+=y;
  13. }
  14. ll quer(int x)
  15. {
  16. ll res=0;
  17. for(int i=x;i;i-=(i&(-i)))res+=tree[i];
  18. return res;
  19. }
  20. int main()
  21. {
  22. scanf("%d",&n);
  23. for(int i=1;i<=n;i++)
  24. {
  25. scanf("%d",&num[i]);
  26. t[i]=num[i];
  27. }
  28. sort(t+1,t+n+1);//离散化处理
  29. for(int i=1;i<=n;i++)
  30. ma[t[i]]=i;
  31. for(int i=1;i<=n;i++)
  32. {
  33. zz[i]=quer(ma[num[i]])*(n-i+1)%mod;//前面的数对zz[i]的贡献
  34. add(ma[num[i]],i);
  35. }
  36. for(int i=1;i<=n;i++)
  37. tree[i]=0;
  38. for(int i=n;i>=1;i--)
  39. {
  40. zz[i]=(zz[i]+quer(ma[num[i]])*i%mod)%mod;//后面的数对zz[i]的贡献
  41. add(ma[num[i]],n-i+1);
  42. zz[i]=(zz[i]+(ll)(n-i+1)*i%mod)%mod;//num[i]对zz[i]的贡献
  43. }
  44. ll ans=0;
  45. for(int i=1;i<=n;i++)
  46. ans=(ans+(ll)num[i]*zz[i]%mod)%mod;
  47. printf("%lld\n",ans);
  48. return 0;
  49. }

  

codeforces#1167F. Scalar Queries(树状数组+求贡献)的更多相关文章

  1. [Codeforces 1208D]Restore Permutation (树状数组)

    [Codeforces 1208D]Restore Permutation (树状数组) 题面 有一个长度为n的排列a.对于每个元素i,\(s_i\)表示\(\sum_{j=1,a_j<a_i} ...

  2. Codeforces 650D - Zip-line(树状数组)

    Codeforces 题目传送门 & 洛谷题目传送门 我怕不是个 nt--一开始忽略了"询问独立"这个条件--然后就一直在想有什么办法维护全局 LIS--心态爆炸 首先离散 ...

  3. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  4. POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8807   Accepted ...

  5. UVA11525 Permutation[康托展开 树状数组求第k小值]

    UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...

  6. 树状数组求第k小的元素

    int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ...

  7. POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)

    树状数组求逆序对   转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...

  8. hdu 4217 Data Structure? 树状数组求第K小

    Data Structure? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  9. poj 2985 The k-th Largest Group 树状数组求第K大

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8353   Accepted ...

随机推荐

  1. springboot+eureka+mybatis+mysql环境下报504 Gateway Time-out

    1.test环境下的数据库配置的 driver和url有问题, 在工程日志中的表现是不能打印出最新的日志,在部署前的日志能看到报错:

  2. git 操作实践

    git操作: - git是一个用于帮助用户实现版本控制的软件 #首先创建项目 1. cd到项目文件目录 2. 鼠标右键点击 Git Bash Here 3. git init #在项目文件目录生成 . ...

  3. C++ STL 之 list

    #include <list> #include <iostream> using namespace std; // 打印list元素 void PrintList(list ...

  4. shell菜单选择

    我们会遇到很多进入后台系统的时候,会根据选择,进入不同的系统,下面是一个简单的例子: #!/bin/sh function menu (){ cat << EOF------------- ...

  5. celery最佳体验

    目录 目录 不使用数据库作为 Broker 不要过分关注任务结果 实现优先级任务 应用 Worker 并发池的动态扩展 应用任务预取数 保持任务的幂等性 应用任务超时限制 善用任务工作流 合理应用 a ...

  6. 【python】python _、__、__xx__之间的差别

    本文来自 yzl11 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yzl11/article/details/53792416?utm_source=copy 单下 ...

  7. 随机模块 random 函数的调用

    随机模块 random 作用: 用于模拟或生成随机输出的模块. 用法示意: import random as R 函数名 描述 R.random() 返回一个[0, 1) 之间的随机实数 R.unif ...

  8. django-bootstrap4|django 加载popper.min.js失败

    1.现象 2.解决过程 2.1.右键查看网页源代码 在浏览器地址栏打开popper.min.js对应的URL,发现无法打开,这个地址是国外的,需要找一个可访问的地址替换. 2.2.找到URL在djan ...

  9. QTP10破解步骤(亲试有效)

    QTP10破解步骤: 1.安装qtp,一路默认下来(一定要默认安装目录),一直到要求输入License的界面 2.拷贝mgn-mqt82.exe到C:\Program Files\Mercury In ...

  10. 使用EasyUI查询与删除

    下面我们创建一个使用EasyUI布局的asp.net网站查询与删除数据(连接数据库) 新建网站-新建数据库(一个表,主要作用是了解一下easyUI的使用) 打开EasyUI帮助文档,自行渲染 使用da ...