2017ACM暑期多校联合训练 - Team 2 1003 HDU 6047 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:
- Choose 2 from {bi}, then a_2…a_4 are available for a_5, and you can let a_5=a_2-2=9;
- 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数组(a数组保存的就是本来的值减去下标)里面找到一个最大值,然后将这个值加入到a数组后面,接着在重复上面的过程。每次在找到一个值之后,线段树都要更新。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#define lchild left,mid,root<<1
#define rchild mid+1,right,root<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 600000;
const int mod = 1e9+7;
int Max[maxn<<2];
int a[maxn];
int b[maxn];
void push_up(int root)
{
Max[root] = max(Max[root<<1],Max[root<<1|1]);
}
///构建线段树
void build(int left,int right,int root)
{
if(left == right)
{
Max[root] = a[left];
return;
}
int mid = (left+right)>>1;
build(lchild);
build(rchild);
push_up(root);
}
int query(int L,int R,int left,int right,int root)///[L,R]是需要查找的区间
{
if(L<=left && right<=R)
return Max[root];
int mid = (left+right)>>1;
int ans = -inf;
if(L<=mid) ans = max(ans,query(L,R,lchild));
if(R>mid) ans = max(ans,query(L,R,rchild));
return ans;
}
void Insert(int pos,int left,int right,int root)
{
if(left == right)
{
Max[root] = a[pos]-pos;
return;
}
int mid = (left+right)>>1;
if(pos<=mid) Insert(pos,lchild);
else Insert(pos,rchild);
push_up(root);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
a[i] = a[i]-i;///a数组中直接保存为它本身减去下标的值,从而每次从里面取得最大值
}
for(int i = 1; i <= n; i++)
{
scanf("%d",&b[i]);
a[i+n] = -inf;
}
sort(b,b+n);
build(1,2*n,1);///因为在从后面取的时候要从整个数组里面取包括后面的部分
int ans = 0;
int range = n;
for(int i = 1; i <= n; i++)
{
int num = query(b[i],range,1,2*n,1);
range++;
a[i+n] = num;
Insert(n+i,1,2*n,1);
ans = (ans+num)%mod;
}
printf("%d\n",ans);
}
return 0;
}
2017ACM暑期多校联合训练 - Team 2 1003 HDU 6047 Maximum Sequence (线段树)的更多相关文章
- 2017ACM暑期多校联合训练 - Team 6 1003 HDU 6098 Inversion (模拟)
题目链接 Problem Description Give an array A, the index starts from 1. Now we want to know Bi=maxi∤jAj , ...
- 2017ACM暑期多校联合训练 - Team 4 1003 HDU 6069 Counting Divisors (区间素数筛选+因子数)
题目链接 Problem Description In mathematics, the function d(n) denotes the number of divisors of positiv ...
- 2017ACM暑期多校联合训练 - Team 3 1003 HDU 6058 Kanade's sum (模拟)
题目链接 Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th largest elem ...
- 2017ACM暑期多校联合训练 - Team 1 1003 HDU 6035 Colorful Tree (dfs)
题目链接 Problem Description There is a tree with n nodes, each of which has a type of color represented ...
- 2017ACM暑期多校联合训练 - Team 4 1004 HDU 6070 Dirt Ratio (线段树)
题目链接 Problem Description In ACM/ICPC contest, the ''Dirt Ratio'' of a team is calculated in the foll ...
- 2017ACM暑期多校联合训练 - Team 9 1005 HDU 6165 FFF at Valentine (dfs)
题目链接 Problem Description At Valentine's eve, Shylock and Lucar were enjoying their time as any other ...
- 2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)
题目链接 Problem Description Giving two strings and you should judge if they are matched. The first stri ...
- 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)
题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...
- 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)
题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...
随机推荐
- 设计模式PHP篇(三)————装饰器模式
简单的用php实现了装饰器模式: <?php /** *简单的装饰器模式 */ class PrintText { protected $decorators = []; public func ...
- php自带的filter过滤函数
PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. filter_has_var()检查是否存在指定输入类型的变量. filter_id()返回指定过滤器的 ID 号. filt ...
- oracle锁与死锁概念,阻塞产生的原因以及解决方案
锁是一种机制,一直存在:死锁是一种错误,尽量避免. 首先,要理解锁和死锁的概念: 1.锁: 定义:简单的说,锁是数据库为了保证数据的一致性而存在的一种机制,其他数据库一样有,只不过实现机制上可能大 ...
- MVC与MVP简单对比
在Java平台,基于Spring等技术的MVC框架已经走向成熟:在.NET平台,微软也推出了MVC.MVP Framework,MVP不同于MVC的地方,关键在于,View不再显示的依赖于Busine ...
- Ubuntu的IP地址配置
概况和需求: 我的主机上有两块网卡,识别后分别是eth0和eth1.eth0配置需要为静态ip,eth1配置为使用动态主机协议获取ip地址. 步骤: 首先碰到的一个问题就是不知道eth0和eth1对应 ...
- Asp.net MVC 获取IPv4 地址
public static string GetIP4Address() { string IP4Address = String.Empty; foreach (IPAddress IPA in D ...
- 【bzoj5099】[POI2018]Pionek 双指针法
题目描述 给你 $n$ 个平面向量,选出它们中的一部分,使得它们的和的长度最大.求这个最大长度的平方. 输入 第一行包含一个正整数n(n<=200000),表示指令条数. 接下来n行,每行两个整 ...
- Xmind8破解,以及相关的流程和破解包
一.下载XMindCrack.jar文件:(传的貌似被屏蔽了:如果需要请留下邮箱,抽空会发给你) 百度云 ,里面破解文件,安装包都给了,但Xmind安装包不一定是最新的,有需求的可自行去官网下载 . ...
- 获取http和ftp地址的图片
根据http和ftp图片地址获取对应图片的缩略图和原图 public class GetBitmapImageClass { public BitmapSource GetImageHttp(stri ...
- DjangoORM使用mysql注意
注意事项1:需要在project下的setting里面做设置.让Django生成MySQL类型的数据库. 注意事项2:在Django内部,连MySQL的时候,需要添加下面2句代码: 4.******* ...