题目链接

BZOJ5157

题解

我们只需计算每个位置为开头产生的贡献大小,就相当于之后每个大于当前位置的位置产生的贡献 + 1之和

离散化后用树状数组维护即可

要注意去重,后面计算的包含之前的,记录下来减去即可

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
#define lbt(x) (x & -x)
using namespace std;
const int maxn = 100005,maxm = 100005,INF = 1000000000,P = 1000000007;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int A[maxn],b[maxn],last[maxn],tot,n,ans;
int getn(int x){return lower_bound(b + 1,b + 1 + tot,x) - b;}
int s[maxn];
void add(int u,int v){while (u <= tot) s[u] = (s[u] + v) % P,u += lbt(u);}
int query(int u){int re = 0; while (u) re = (re + s[u]) % P,u -= lbt(u); return re;}
int sum(int l,int r){return ((query(r) - query(l - 1)) % P + P) % P;}
int main(){
n = read();
REP(i,n) A[i] = b[i] = read();
sort(b + 1,b + 1 + n); tot = 1;
for (int i = 2; i <= n; i++) if (b[i] != b[tot]) b[++tot] = b[i];
for (int i = 1; i <= n; i++) A[i] = getn(A[i]);
tot++;
for (int i = n; i; i--){
int tmp = sum(A[i] + 1,tot),t = tmp - last[A[i]];
ans = (ans + t) % P;
last[A[i]] = tmp;
tmp = ((tmp - sum(A[i],A[i]) + 1) % P + P) % P;
add(A[i],tmp);
}
printf("%d\n",(ans % P + P) % P);
return 0;
}

最新文章

  1. 利用Tomcat内置的servlet实现文件下载功能
  2. 跨语言和跨编译器的那些坑(CPython vs IronPython)
  3. Fiddler 手机端证书安装No root certificate was found
  4. 6个朋友(codevs 2832)
  5. php根据身份证号码计算年龄
  6. hadoop之JobTracker功能分析
  7. Understanding node.js
  8. django: db - many to many
  9. LoadLibrary 失败 GetLastError 126
  10. CodeForces 327C
  11. 软件测试人员在工作中如何运用Linux
  12. Spring Cloud番外篇-001
  13. Android 底部导航栏实现一 Fragment-replace
  14. Spring(1)_Bean初始化
  15. 震惊!最全PyCharm教程
  16. 网格视图GridView的使用
  17. Ubuntu下SSH安装
  18. CVE-2010-0249 IE8 UAF漏洞分析
  19. HDU 2242 考研路茫茫——空调教室(边双连通分量+树形dp+重边标号)
  20. 基于点线特征的Kinect2实时环境重建(Tracking and Mapping)

热门文章

  1. Java分享笔记:FileInputStream流的 read()方法 和 read(byte[] b)方法
  2. linux下后台运行jar包
  3. python中上双互斥锁的线程执行流程
  4. Python代码结构——顺序、分支、循环
  5. php性能优化 --- laravel 性能优化
  6. 呕心沥血写的python猜数字
  7. C语言函数篇(五)静态库和动态库的创建和使用
  8. C语言函数篇(一)函数的组成
  9. Javascript Step by Step - 03
  10. 简易版AI英文问答程序解决