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+1…a2n. Just like always, there are some restrictions on an+1…a2n: 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来做超时一发的时候都觉得自己简直是太傻逼了///
为自己续一秒。。。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string.h>
#include<queue>
#include<vector>
using namespace std; #define MOD 1000000000+7 struct node
{
long long num,ip,dis;
}; long long b[]; struct cmp
{
bool operator()(node q,node p)
{
return q.dis<p.dis;
}
}; int main()
{
long long n;
while(~scanf("%lld",&n))
{
priority_queue<node,vector<node>,cmp>Q;
node a;
for(int i=;i<=n;i++)
{
scanf("%lld",&a.num);
a.ip=i;
a.dis=a.num-a.ip;
Q.push(a);
}
for(int i=;i<=n;i++)
scanf("%lld",&b[i]);
sort(b+,b++n);
long long res=;
for(int i=;i<=n;i++)
{
while(Q.top().ip<b[i])
Q.pop();
node tmp=Q.top();
res+=tmp.dis;
res%=MOD;
tmp.ip=n+i;
tmp.num=tmp.dis;
tmp.dis-=tmp.ip;
Q.push(tmp);
}
printf("%lld\n",res);
}
return ;
}

HDU 6047 17多校 Maximum Sequence(优先队列)的更多相关文章

  1. HDU 6140 17多校8 Hybrid Crystals(思维题)

    题目传送: Hybrid Crystals Problem Description > Kyber crystals, also called the living crystal or sim ...

  2. HDU 6143 17多校8 Killer Names(组合数学)

    题目传送:Killer Names Problem Description > Galen Marek, codenamed Starkiller, was a male Human appre ...

  3. HDU 3130 17多校7 Kolakoski(思维简单)

    Problem Description This is Kolakosiki sequence: 1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1……. This seq ...

  4. HDU 6103 17多校6 Kirinriki(双指针维护)

    Problem Description We define the distance of two strings A and B with same length n isdisA,B=∑i=0n− ...

  5. HDU 6106 17多校6 Classes(容斥简单题)

    Problem Description The school set up three elective courses, assuming that these courses are A, B, ...

  6. HDU 6049 17多校2 Sdjpx Is Happy(思维题difficult)

    Problem Description Sdjpx is a powful man,he controls a big country.There are n soldiers numbered 1~ ...

  7. HDU 6045 17多校2 Is Derek lying?

    题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=6045 Time Limit: 3000/1000 MS (Java/Others)    Memory ...

  8. HDU 6124 17多校7 Euler theorem(简单思维题)

    Problem Description HazelFan is given two positive integers a,b, and he wants to calculate amodb. Bu ...

  9. HDU 6038 17多校1 Function(找循环节/环)

    Problem Description You are given a permutation a from 0 to n−1 and a permutation b from 0 to m−1. D ...

随机推荐

  1. Hybrid APP架构设计思路

    通讯 作为一种跨语言开发模式,通讯层是Hybrid架构首先应该考虑和设计的,往后所有的逻辑都是基于通讯层展开. Native(以Android为例)和H5通讯,基本原理: Android调用H5:通过 ...

  2. python-day81--Ajax

    一.准备知识:json 1.什么是json? JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.任何的语言之间都可以用json进行数据的交 ...

  3. c# 操作文本文件

    计算机在最初只支持ASCII编码,但是后来为了支持其他语言中的字符(比如汉字)以及一些特殊字符(比如€),就引入了Unicode字符集.基于Unicode字符集的编码方式有很多,比如UTF-7.UTF ...

  4. PAT 1005 Spell It Right

    1005 Spell It Right (20 分)   Given a non-negative integer N, your task is to compute the sum of all ...

  5. Leetcode 98

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  6. set unused的用法(ORACLE删除字段)

    set unused的用法(ORACLE删除字段) 一.问题 现场有一张大数据量的分区表,数据量在10G以上.因某种原因需要删除其中的某些字段.如果直接用alter table1 drop (colu ...

  7. Python3 ElementTree.tostring()导致标签前辍变为ns0/ns1处理

    一.说明 python中我们经常借助xml.etree.ElementTree对xml进行处理,其中ElementTree.fromstring()将字符串格式化成et对象,ElementTree.t ...

  8. linux定时删除文件脚本

    #! /bin/sh # 配置项DEBUG=truefolderDir=/var/www/html/hlsrecord/EXPIRE_DAY=1 # 过期时间和时间戳deadTime=`date -d ...

  9. js 求select option 的值和对应option的内容

    <select onChange="aa(this)" name="a"> <option value="a">1& ...

  10. ROM和RAM区别

    在计算机的组成结构中,有一个很重要的部分,就是存储器.存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作.存储器的种类很多,按其用途分为主存储器和辅助存储器, ...