您的位置:首页 > 其它

周中训练笔记(五)

2017-09-28 20:56 218 查看
离散化:建立一个结构体,结构体含有两个整型,一个存输入的数一个存下标,然后定义一个比较函数,利用sort将其排序,然后用一个新的一维数组进行循环赋值,就可以将结构体进行排序。

struct node

{

int val;

int num;

}a[100];

   for(i=1;i<=n;i++){

        cin>>a[i].val;

        a[i].num=i;

    }

将其排序。

for(i=1;i<=n;i++)

b[a[i].num]=i;

题目大意:给出一个序列求其不下降子序列的个数,如果存在相同的元素就分别列出。

代码:#include<iostream>

#include<algorithm>

#include<cstring>

using namespace std;

#define Max   1000000007

#define m 1000010

int s[m],c[m],b[m],n;

struct node{

int val;

int num;

}a[m];

bool comp(node a,node b){

return  a.val<b.val;

}

int lowbit(int i){

return i&(-i);

}

void update(int i,int x){

  while(i<=n){

    s[i]+=x;

    s[i]%=Max;

    i+=lowbit(i);

  }

}

int getsum(int i){

int sum=0;

while(i>0){

    sum+=s[i];

    sum%=Max;

    i-=lowbit(i);

}

return sum;

}

int main(){

    int i;

while(cin>>n){

        memset(s,0,sizeof(s));

        memset(b,0,sizeof(b));

        memset(c,0,sizeof(c));

    for(i=1;i<=n;i++){

        cin>>a[i].val;

        a[i].num=i;

    }

    sort(a+1,a+n+1,comp);

    b[a[1].num]=1;

    for(i=2;i<=n;i++){

        if(a[i].val==a[i-1].val)

            b[a[i].num]=b[a[i-1].num];

        else

         b[a[i].num]=i;

    }

    for(i=1;i<=n;i++){

        c[i]=getsum(b[i])+1;

        update(b[i],c[i]);

    }

    int all=getsum(n);

    cout<<all<<endl;

}

return 0;

}

解题思路:先把结构体离散化,然后利用一次循环c[i]=getsum(b[i])+1,c[i]存的是按升序排序后的第b[i]个元素总共有多少个子序列,算出之后利用update函数把包含b[i]个数的c[i]更新,最后用getsum函数算出来算出来总和。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: