zoukankan      html  css  js  c++  java
  • HDU 6047 17多校 Maximum Sequence(优先队列)

    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;
     
     
    题意:给一个长度为n的a数组和b数组,然后给a在后面再填充n个数字,要求每次填充都是在b中选择一个数,设挑选的数为bx,设j为我目前要填充的数的序号,那么你填充的数就是a中序号从(bx)~(j-1)中最大的那个a[i]-i,最终使填充数的和最大。
    题解:
    1.要使最终结果最大的话,每次填充的数都尽可能的大,因为最先填的数减的数最小,所以对b来说先从小到大排序,能保证先填充的数最大。
    2.为了维持每次挑选的是最大的数,可以用一个优先队列来维护,按照它的a[i]-i的值来进行排序。
    3.最精华的地方,因为b已经排过序了,然后每次加的是最大的数,所以我只要保证队列的top的id要大于等于目前的b[i]即可。
     
    每次用优先队列来维护最大最小值的题目我用sort来做超时一发的时候都觉得自己简直是太傻逼了///
    为自己续一秒。。。
     
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<string.h>
     6 #include<queue>
     7 #include<vector>
     8 using namespace std;
     9 
    10 #define MOD 1000000000+7
    11 
    12 struct node
    13 {
    14     long long num,ip,dis;
    15 };
    16 
    17 long long b[250005];
    18 
    19 struct cmp
    20 {     
    21     bool operator()(node q,node p)
    22    {
    23          return q.dis<p.dis;
    24     }
    25  };
    26 
    27 int main()
    28 {
    29     long long n;
    30     while(~scanf("%lld",&n))
    31     {
    32         priority_queue<node,vector<node>,cmp>Q;
    33         node a;
    34         for(int i=1;i<=n;i++)
    35         {
    36             scanf("%lld",&a.num);
    37             a.ip=i;
    38             a.dis=a.num-a.ip;
    39             Q.push(a);
    40         }
    41         for(int i=1;i<=n;i++)
    42             scanf("%lld",&b[i]);
    43         sort(b+1,b+1+n);
    44         long long res=0;
    45         for(int i=1;i<=n;i++)
    46         {
    47             while(Q.top().ip<b[i])
    48                 Q.pop();
    49             node tmp=Q.top();
    50             res+=tmp.dis;
    51             res%=MOD;
    52             tmp.ip=n+i;
    53             tmp.num=tmp.dis;
    54             tmp.dis-=tmp.ip;
    55             Q.push(tmp);
    56         }
    57         printf("%lld
    ",res);
    58     }
    59     return 0;
    60 }
  • 相关阅读:
    能成大事儿的人,都具备这5个特质
    元气森林唐彬森:苦了10年我发现,发大财首先要会选
    反者道之动,亿万富翁查理芒格受用一生的逆向思维
    解决不了bug先放着,这里有40条提升编程技能小妙招
    理解maven命令package、install、deploy的联系与区别
    每日一则
    《穷查理年鉴》贪嗔痴 & 懒贪装(关于败坏)
    C++构造函数
    C++类的定义和封装
    C++访问控制限定符
  • 原文地址:https://www.cnblogs.com/Annetree/p/7250177.html
Copyright © 2011-2022 走看看