hdu 6047 Maximum Sequence(2017 Multi-University Training Contest
来源:互联网 发布:企查查数据采集器 编辑:程序博客网 时间:2024/06/05 01:52
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+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;
官方题解:
代码:
#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>using namespace std;const int maxn=250000+10;const int mod=1e9+7;int maxx[maxn],a[maxn<<1],b[maxn];int n;int main(){ while(~scanf("%d",&n)) { memset(maxx,0,sizeof(maxx)); int x; for(int i=1;i<=n;++i) scanf("%d",&x),a[i]=x-i; for(int i=n;i>0;--i)//预处理出i~n的最大值 maxx[i]=max(maxx[i+1],a[i]); for(int i=1;i<=n;++i) scanf("%d",&b[i]); priority_queue<int>qs; for(int i=1;i<=n;++i) qs.push(maxx[b[i]]); int tmp=0,ans=0; for(int i=n+1;i<=n<<1;++i) { if(tmp>qs.top()) a[i]=tmp-i; else a[i]=qs.top()-i,qs.pop(); ans=(ans+a[i]+i)%mod; tmp=max(tmp,a[i]); } printf("%d\n",ans); } return 0;}
- hdu 6047 Maximum Sequence(2017 Multi-University Training Contest
- HDU 6047 2017 Multi-University Training Contest
- HDU_【2017 Multi-University Training Contest 2】——1003 Maximum Sequence
- HDU 3068 2017 Multi-University Training Contest
- HDU 6034 & 2017 Multi-University Training Contest
- hdu 6034 2017 Multi-University Training Contest
- HDU 3065 2017 Multi-University Training Contest
- HDU 6052 2017 Multi-University Training Contest
- HDU 6058 2017 Multi-University Training Contest
- HDU 6078 2017 Multi-University Training Contest
- hdu 4915 Parenthese sequence--2014 Multi-University Training Contest 5
- 2015 Multi-University Training Contest 1 Hdu 5297 Y sequence
- hdoj 6047( 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest
- CCF CSP 201612-2 工资计算(Java-100分)
- 暑期学习记录06
- LintCode 字符串置换 JAVA
- 机器学习实战 Ch10 K-均值聚类
- 【实验楼 Python 简明教程】挑战3 玩转函数
- hdu 6047 Maximum Sequence(2017 Multi-University Training Contest
- SpringBoot使用阿里大于短信接口
- Android Studio2.3版本以上 打包时V1和V2的区别
- 倒计时的实现&&settimeout和setinterval的区别
- 数据库中字段的数据格式为 1,2,3 时如何处理数据
- 过滤和排序数据1
- 网站核心页面优化:打造搜索引擎喜爱的页面
- QT-控件阴影效果
- Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例