fzoj 2236 第十四个目标 (树状数组&LIS&dp)好题

来源:互联网 发布:中国雷达 知乎 编辑:程序博客网 时间:2024/05/18 05:49
 Problem 2236 第十四个目标

Accept: 14    Submit: 26
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

3
1 3 2

 Sample Output

5

 Source

福州大学第十三届程序设计竞赛
//分析:
如果n的值比较小,那么就是一个纯粹的dp题。设dp[i]表示以a[i]为结尾非降子序列的个数,其状态转移方程为:

         

最后ans = sigma(dp[i]) 其中(1 <= i <= n)

可以看出,这样做的时间复杂度是,很显然不能这样做。

那么实际上,我们看到会想到逆序数,自然也会想到求逆序数最经典的做法就是树状数组,所以问题可以转化为求逆序数的对数,那么我们可以利用dp的思想递推下去,最终求得答案,可以看出这样做的时间复杂度为

#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>using namespace std;const int N = 100005;const int MOD = 1000000007;struct node{    int id,val;};int n;node a[N];int aa[N],c[N],t[N];bool cmp(node a,node b){    return a.val < b.val;}int Lowbit(int x){    return x & (-x);}void Update(int t,int val){    for(int i=t; i<=n; i+=Lowbit(i))    {        c[i] += val;        c[i] %= MOD;    }}int getSum(int x){    int ans = 0;    for(int i=x; i>0; i-=Lowbit(i))    {        ans += c[i];        ans %= MOD;    }    return ans;}int main(){    while(scanf("%d",&n)!=EOF)    {        memset(c,0,sizeof(c));        memset(aa,0,sizeof(aa));        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i].val);            a[i].id = i;        }        sort(a+1,a+n+1,cmp);        aa[a[1].id] = 1;        for(int i=2;i<=n;i++)        {            if(a[i].val != a[i-1].val)                aa[a[i].id] = i;            else                aa[a[i].id] = aa[a[i-1].id];        }        for(int i=1;i<=n;i++)        {            t[i] = getSum(aa[i]-1);            Update(aa[i],t[i]+1);        }        printf("%d\n",getSum(n));    }    return 0;}


 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 扣扣邮箱里的邮件过期了怎么办 一体机的管理员账号被删除了怎么办 手机里的邮箱重要吗删除了怎么办 华为荣耀10账号邮箱忘记了怎么办 大陆微信号在台湾登录不上怎么办 威纶触摸屏被禁止到反编译了怎么办 微信公众号邮箱被占用怎么办 京东绑定的手机号不用了怎么办 绑定微信的手机号不用了怎么办 绑定支付宝的手机号不用了怎么办 百度账号手机号换了密码忘了怎么办 换手机好了华为账号密码忘了怎么办 苹果手机忘了id账号和密码怎么办 金立手机账号密码忘了怎么办 乐视手机账号密码忘了怎么办 企业邮箱发出去邮件撤不回来怎么办 餐厅加热保温设备零线带电怎么办 小米手机不小心把照片删了怎么办 华为手机不小心把照片删了怎么办 网易邮箱被改成别人的姓名怎么办 苹果手机忘记id密码和邮箱怎么办 163邮箱下载的附件没有了怎么办 小米自带浏览器打开网页太慢怎么办 再歪一点授权码忘记了怎么办 注册支付宝的手机号不用了怎么办 手机号被别人注册了支付宝怎么办 支付宝账号密码都忘了怎么办 申请微信公众号邮箱被占用怎么办 邮箱注册微博需要手机验证怎么办 苹果手机的ad码忘记了怎么办 苹果手机酷狗音乐没有声音怎么办 在手机屏上不能缷载软件怎么办? 手机酷狗音乐下载歌曲要钱怎么办 酷狗下载歌曲后歌词不见了怎么办 手机酷我音乐缓冲文件损坏怎么办 苹果手机音乐里的歌删掉了怎么办 上课学生把粉笔擦藏起来了怎么办 手机没法解压10g压缩包怎么办 苹果id被锁邮箱也忘记密码怎么办 手机号注册的微信忘记密码怎么办 qq号注册微信忘记密码怎么办