hdu_2227_Find the nondecreasing subsequences_树状数组,离散化
2016-05-04 15:52
399 查看
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2227
题意:给你一个集合,让你求递增子序列有多少个,和树状数组求逆序对差不多,不过数据比较大,要离散化一下。
题意:给你一个集合,让你求递增子序列有多少个,和树状数组求逆序对差不多,不过数据比较大,要离散化一下。
#include<cstdio> #include<algorithm> #define FFC(i,a,b) for(int i=a;i<=b;i++) #define LL long long using namespace std; LL tree[100010]; int maxn,mod=1000000007,l,r,t,len,mid; int dt[100010],a[100010]; void init(int n){maxn=n;for(int i=0;i<=maxn;i++)tree[i]=0;} inline void add(int x,int v){for(int i=x;i<=maxn;i+=i&-i)tree[i]=(tree[i]+v)%mod;} inline LL sum(int x){LL an=0;for(;x>0;x-=x&-x)an=(an+tree[x])%mod;return an;} inline int lowb(int x){for(l=1,r=len;l<=r;)if(a[mid=(l+r)>>1]>=x)r=(t=mid)-1;else l=mid+1;} int main(){ int n; while(~scanf("%d",&n)){ FFC(i,1,n){ scanf("%d",&dt[i]); a[i]=dt[i];//离散化数组 } sort(a+1,a+1+n); len=unique(a+1,a+1+n)-a-1;//离散化 init(len); LL ans=0; FFC(i,1,n){ lowb(dt[i]);//二分查找 int tt=sum(t); add(t,tt+1); ans=(ans+tt+1)%mod;//注意,一个数它本身也是一个递增子列,所以要加一 } printf("%lld\n",ans); } return 0; }
相关文章推荐
- servlet 的request 属性常用方法
- UIAlertContronller的使用
- 1584 - Circular Sequence
- POJ 1776 Task Sequences(竞赛图构造哈密顿通路)
- UINavigationController 导航控制器
- 使用Git GUI同步本地和远程源代码
- JAVA UUID 生成策略研究之为什么
- 第三届山东省ACM Fruit Ninja II
- UIButton
- 第三届山东ACM省赛 Fruit Ninja I
- 使用Git GUI获取远程项目源代码实例
- UITableView的使用详解
- iOS之UITextField怎么自定义键盘的return键
- vue.js学习资料
- 快速排序(Quick Sort)介绍
- java循环结构(以及break,continue的使用)
- Call requires API level 3 (current min is 1)
- UITableView的优化技巧
- iOS中UISearchBar(搜索框)使用总结
- AbstractSequentialList源码分析