zoukankan      html  css  js  c++  java
  • 多校二 1003Maximum Sequence 模拟

    Maximum Sequence

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1887    Accepted Submission(s): 671


    Problem Description
    Steph is extremely obsessed with “sequence problems” that are usually seen on magazines: Given the sequence 11, 23, 30, 35, what is the next number? Steph always finds them too easy for such a genius like himself until one day Klay comes up with a problem and ask him about it.

    Given two integer sequences {ai} and {bi} with the same length n, you are to find the next n numbers of {ai}: an+1a2n . Just like always, there are some restrictions on an+1a2n : for each number ai , you must choose a number bk from {bi}, and it must satisfy ai ≤max{aj -j│bk ≤j<i}, and any bk can’t be chosen more than once. Apparently, there are a great many possibilities, so you are required to find max{2nn+1ai } modulo 109 +7 .

    Now Steph finds it too hard to solve the problem, please help him.
     
    Input
    The input contains no more than 20 test cases.
    For each test case, the first line consists of one integer n. The next line consists of n integers representing {ai}. And the third line consists of n integers representing {bi}.
    1≤n≤250000, n≤a_i≤1500000, 1≤b_i≤n.
     
    Output
    For each test case, print the answer on one line: max{2nn+1ai } modulo 109 +7。
     
    Sample Input
    4 8 11 8 5 3 1 4 2
     
    Sample Output
    27
    Hint
    For the first sample: 1. Choose 2 from {bi}, then a_2…a_4 are available for a_5, and you can let a_5=a_2-2=9; 2. Choose 1 from {bi}, then a_1…a_5 are available for a_6, and you can let a_6=a_2-2=9;
     
     
    题意:在a数组后面添加n个数, 其中每个数需要满足它是从bk的位置到a数组最后中小于等于
    aj-j的值,求所添加的数的和的最大值。
     
    分析:样例分析:

    a: 8 11 8 5

    a[i]-i: 7  9  5  1

    b:3 1 4 2

    先将b排序得到  b: 1 2 3 4

    那么取第一个b[0]=1 那么取到9

    a:8 11 8 5 9

    a[i]-i: 7 9 5 1 4

    b[1]=2 还是取到 9

    a: 8 11 8 5 9 9

    a[i]-i: 7 9 5 1 4 3

    后面继续这样取最终得到的是

    a: 8 11 8 5 9 9 5 4  多出来的就是 27

    那么从模拟的这个过程可以发现,只要记录当前位置到n中间的最大值 和更新出来的数中的最大值

    进行比较取最大的那个,就是答案啦~

    代码:

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<iostream>
    #include<algorithm>

    using namespace std;
    #define N 300009
    #define mod 1000000007
    long long a[N], b[N], maxa[N];
    int main()
    {

    int n;

    while(scanf("%d", & n) != EOF)
    {
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    memset(maxa, 0, sizeof(maxa));

    for(int i = 1; i <= n; i++)
    {
    scanf("%lld", &a[i]);
    a[i] = a[i] - i;
    }

    for(int i = 1; i <= n; i++)
    scanf("%lld", &b[i]);

    sort(b, b+n+1);

    for(int i = n ; i >= 1; i--)
    {
    maxa[i] = max(maxa[i+1], a[i]);
    }

    long long ans = 0;

    ans += maxa[b[1]];
    ans %= mod;

    long long t = maxa[b[1]] - n - 1;

    for(int i = 2; i <= n; i++)
    {
    maxa[b[i]] = max(maxa[b[i]], t);

    ans += maxa[b[i]];
    ans %= mod;

    t = max(t, maxa[b[i]] - n - i);

    }
    printf("%lld ", ans);
    }
    }

  • 相关阅读:
    作业
    js判断数组对象属性是否含有某个值
    js去除对象数组中的空值
    js根据含有对象的数组中某一个属性进行排序
    import re
    1
    pycharm2020.3安装激活教程,pycharm2020激活教程
    Elasticsearch(安装篇):Windows下安装和运行Elasticsearch
    Spring Boot (日志篇):Log4j整合ELK,搭建实时日志平台
    Spring Boot(日志篇):Logback集成ELK,处理日志实例
  • 原文地址:https://www.cnblogs.com/dll6/p/7250955.html
Copyright © 2011-2022 走看看