第十四个目标 FZU - 2236 离散化 树状数组
2017-08-01 16:49
169 查看
Problem 2236 第十四个目标
Accept: 137 Submit: 436
目暮警官、妃英里、阿笠博士等人接连遭到不明身份之人的暗算,柯南追踪伤害阿笠博士的凶手,根据几起案件现场留下的线索发现凶手按照扑克牌的顺序行凶。在经过一系列的推理后,柯南发现受害者的名字均包含扑克牌的数值,且扑克牌的大小是严格递增的,此外遇害者与毛利小五郎有关。
为了避免下一个遇害者的出现,柯南将可能遭到暗算的人中的数字按关联程度排列了出来,即顺序不可改变。柯南需要知道共有多少种可能结果,满足受害人名字出现的数字严格递增,但是他柯南要找出关键的证据所在,所以这个任务就交给你了。
(如果你看不懂上面在说什么,这题是求一个数列中严格递增子序列的个数。比如数列(1,3,2)的严格递增子序列有(1)、(3)、(2)、(1,3)、(1,2),共5个。长得一样的但是位置不同的算不同的子序列,比如数列(3,3)的答案是2。)
多组数据(<=10),处理到EOF。
第一行输入正整数N(N≤100 000),表示共有N个人。
第二行共有N个整数Ai(1≤Ai≤10^9),表示第i个人名字中的数字。
每组数据输出一个整数,表示所有可能的结果。由于结果可能较大,对1 000 000 007取模后输出。
31 3 2
5
福州大学第十三届程序设计竞赛
令c[i]为以i为上升序列末尾所能构成的序列的个数,那么只需要知道在比i小的数一共出现了几次,再加1(代表自己单独成立),就是它所能构成的个数,最后答案就是sigma(c[i])(1<=i<=n),是n是因为我们还得做一次离散化。
Accept: 137 Submit: 436
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
目暮警官、妃英里、阿笠博士等人接连遭到不明身份之人的暗算,柯南追踪伤害阿笠博士的凶手,根据几起案件现场留下的线索发现凶手按照扑克牌的顺序行凶。在经过一系列的推理后,柯南发现受害者的名字均包含扑克牌的数值,且扑克牌的大小是严格递增的,此外遇害者与毛利小五郎有关。为了避免下一个遇害者的出现,柯南将可能遭到暗算的人中的数字按关联程度排列了出来,即顺序不可改变。柯南需要知道共有多少种可能结果,满足受害人名字出现的数字严格递增,但是他柯南要找出关键的证据所在,所以这个任务就交给你了。
(如果你看不懂上面在说什么,这题是求一个数列中严格递增子序列的个数。比如数列(1,3,2)的严格递增子序列有(1)、(3)、(2)、(1,3)、(1,2),共5个。长得一样的但是位置不同的算不同的子序列,比如数列(3,3)的答案是2。)
Input
多组数据(<=10),处理到EOF。第一行输入正整数N(N≤100 000),表示共有N个人。
第二行共有N个整数Ai(1≤Ai≤10^9),表示第i个人名字中的数字。
Output
每组数据输出一个整数,表示所有可能的结果。由于结果可能较大,对1 000 000 007取模后输出。
Sample Input
31 3 2
Sample Output
5
Source
福州大学第十三届程序设计竞赛令c[i]为以i为上升序列末尾所能构成的序列的个数,那么只需要知道在比i小的数一共出现了几次,再加1(代表自己单独成立),就是它所能构成的个数,最后答案就是sigma(c[i])(1<=i<=n),是n是因为我们还得做一次离散化。
#include <iostream> #include <cstdio> #include <ctime> #include <cstring> #include <algorithm> #include <vector> #include <map> #include <cmath> #include <set> #include <queue> using namespace std; typedef long long ll; const int INF=1e9+100; const ll lINF=1e13; const ll mod=1e9+7; ll bit[100005]; int a[100005],b[100005]; int n,k,cas=1; void add(ll x,ll val){ while(x<=n){ bit[x]=(bit[x]+val)%mod; x+=x&-x; } } ll getsum(ll x){ ll sum=0; while(x){ sum=(sum+bit[x])%mod; x-=x&-x; } return sum; } int main(){ //freopen("out.txt","w",stdout); while(scanf("%d",&n)!=EOF){ memset(bit,0,sizeof(bit)); for(int i=0;i<n;i++){ scanf("%d",&a[i]); b[i]=a[i]; } sort(b,b+n); for(int i=0;i<n;i++){ a[i]=lower_bound(b,b+n,a[i])-b+1; } for(int i=0;i<n;i++){ add(a[i],getsum(a[i]-1)+1); } printf("%I64d\n",getsum(n)); } return 0; }
相关文章推荐
- FZU2236 第十四个目标 (树状数组+离散化)
- FZU 2236 第十四个目标(严格上升子序列个数 离散化 + 树状数组)
- fzu-oj 2236 第十四个目标-树状数组
- Foj 2236 第十四个目标 (树状数组+简单dp+离散化)
- FZU 2236 第十四个目标【Dp+离散化+树状数组】套路题
- fzu oj 2236 第十四个目标 树状数组好题 dp
- FZU 2236(离散化+树状数组)
- FZU 2236 第十四个目标 (dp+树状数组)
- DP+树状数组——FZU 2236 第十四个目标
- FZU2236 第十四个目标 dp+树状数组优化
- FZU 2236 第十四个目标 (线段树)
- FZU2236 第十四个目标 (树状数组)
- 树状数组: fzu oj 2236 第十四个目标
- fzuoj Problem 2236 第十四个目标(树状数组+dp)
- Problem 2236 第十四个目标
- FZu Problem 2236 第十四个目标 (线段树 + dp)
- fzoj 2236 第十四个目标 (树状数组&LIS&dp)好题
- HDU - 5877 Weak Pair (dfs+离散化+树状数组)
- 【HDU - 5124】 lines 【树状数组+离散化】
- HDU 5101 Select --离散化+树状数组