【多校训练2】HDU 6047 Maximum Sequence
http://acm.hdu.edu.cn/showproblem.php?pid=6047
【题意】
- 给定两个长度为n的序列a和b,现在要通过一定的规则找到可行的a_n+1.....a_2n,求sum{a_n+1.....a_2n}的最大值
- 每次从序列b中选择一个数bk,那么构造的ai就是max{aj -j},其中bk<=j<i
- 每个bk最多用一次
【思路】
- 首先我们需要的是aj-j
- 可以贪心,即对于当前要构造的数ai,尽可能找bk使得能够取得最大的aj-j
- 线段树区间查询最优值+单点更新
- 把b排个序,对于每个b查询b[i]~n+i-1的最大值
【Accepted】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#define lson (i<<1)
#define rson (i<<1|1)
#include<vector>
#include<map>
using namespace std;
const int maxn=(25e4+)*;
typedef long long ll;
const ll mod=1e9+;
const int inf=0x3f3f3f3f;
long long val[maxn];
int a[maxn];
int b[maxn];
int n;
struct Seg
{
int l,r,lazy,val;
}tree[maxn<<]; void push_up(int i)
{
tree[i].val=max(tree[lson].val,tree[rson].val);
} void push_down(int i)
{
if(tree[i].lazy==-)
{
return;
}
tree[lson].lazy=tree[lson].val=tree[i].lazy;
tree[rson].lazy=tree[rson].val=tree[i].lazy;
tree[i].lazy=-;
} void Build(int l,int r,long long i=)
{
tree[i].l=l;
tree[i].r=r;
tree[i].lazy=-;
if(l==r)
{
tree[i].val=val[l];
return;
}
push_down(i);
int mid=(tree[i].l+tree[i].r)>>;
Build(l,mid,lson);
Build(mid+,r,rson);
push_up(i);
} int Query(int l,int r,int i=)
{
if(tree[i].l==l&&tree[i].r==r)
{
return tree[i].val;
}
push_down(i);
int mid=(tree[i].l+tree[i].r)>>;
if(r<=mid)
{
return Query(l,r,lson);
}
else if(l>mid)
{
return Query(l,r,rson);
}
else
{
return max(Query(l,mid,lson),Query(mid+,r,rson));
}
} void Setval(int l,int r,int x,int i=)
{
if(tree[i].l==l&&tree[i].r==r)
{
tree[i].lazy=tree[i].val=x;
return;
}
push_down(i);
int mid=(tree[i].l+tree[i].r)>>;
if(r<=mid)
{
Setval(l,r,x,lson);
}
else if(l>mid)
{
Setval(l,r,x,rson);
}
else
{
Setval(l,mid,x,lson);
Setval(mid+,r,x,rson);
}
push_up(i);
} int main()
{
while(~scanf("%d",&n))
{
for(int i=;i<=*n;i++)
{
val[i]=-inf;
}
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
val[i]=a[i]-i;
}
Build(,*n);
for(int i=;i<=n;i++)
{
scanf("%d",&b[i]);
}
sort(b+,b++n);
ll ans=;
b[]=;
for(int i=;i<=n;i++)
{
int mmax=Query(b[i],n+i-);
ans=(ans+(ll)mmax)%mod;
Setval(n+i,n+i,mmax-(n+i));
}
cout<<ans<<endl;
}
return ;
}
线段树区间查询最优值+单点修改
【多校训练2】HDU 6047 Maximum Sequence的更多相关文章
- HDU 6047 - Maximum Sequence | 2017 Multi-University Training Contest 2
/* HDU 6047 - Maximum Sequence [ 单调队列 ] 题意: 起初给出n个元素的数列 A[N], B[N] 对于 A[]的第N+K个元素,从B[N]中找出一个元素B[i],在 ...
- HDU 6047 Maximum Sequence(线段树)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...
- HDU 6047 Maximum Sequence(贪心+线段树)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...
- HDU 6047 Maximum Sequence
Maximum Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 2&&hdu 6047 Maximum Sequence
Maximum Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 2017ACM暑期多校联合训练 - Team 2 1003 HDU 6047 Maximum Sequence (线段树)
题目链接 Problem Description Steph is extremely obsessed with "sequence problems" that are usu ...
- hdu 6047: Maximum Sequence (2017 多校第二场 1003)【贪心】
题目链接 可以贪心写,先把b数组按从小到大的顺序排个序,根据b[i]的值来产生a[n+i] 借助一个c数组,c[i]记录,j从i到n,a[j]-j的最大值,再加上一个实时更新的变量ma,记录从n+1到 ...
- hdu 6047 Maximum Sequence(贪心)
Description Steph is extremely obsessed with "sequence problems" that are usually seen on ...
- hdu 6047 Maximum Sequence 贪心
Description Steph is extremely obsessed with “sequence problems” that are usually seen on magazines: ...
随机推荐
- laravel oauth2.0 文件上传报错
报错信息: "message": "Invalid stream or file provided for UploadedFile", " ...
- iOS面试题之内存管理
本文围绕内存管理的几种方法展开叙述. 1.内存管理是什么? 内存管理,就是对内存资源进行优化. 2.内存管理的三种方法? Objective-C的内存管理主要有三种方式ARC(自动内存计数).MRC( ...
- springmvc+maven搭建web项目之二 通过另一种方式配置spring
1.创建maven web项目 2. 配置pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x ...
- 怎么用eclipse生成jar文件?eclipse导出jar介绍
1 .我们先要增加jar需要的配置文件,选中项目的src目录,鼠标右键,选择 [New] -选择 [Folder] . 2. 输入META-INF 作为目录名称,点击[Finish] . 3. 选中刚 ...
- (转)Spring的概述
http://blog.csdn.net/yerenyuan_pku/article/details/69663685 Spring的概述 什么是Spring 据度娘所载: Spring是一个开源框架 ...
- k8s 重要概念[转]
在实践之前,必须先学习 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石. Cluster Cluster 是计算.存储和网络资源的集合,Kubernetes 利用这 ...
- Must set property 'expression' before attempting to match
因为这个问题没有直接指向问题的地点, 所以找起来不是很容易. 但是如果找不到, 这个错就会一直都存在. 原因分析: 在使用切面编程的时候, 没有把切入点配置全面 解决方法: 在before, afte ...
- ES6 第五章 字符串的新增方法 具体参照 http://es6.ruanyifeng.com
1.FormCodePoint 对象方法 用于从 Unicode 码点返回对应字符,可以识别原来es5不能识别的大于0xFFFF的码点. String.fromCodePoint(0x20BB7) / ...
- net core 使用ef生成实体类(SqlServer)
1)打开程序包管理器控制台 2)输入命令 Install-Package Microsoft.EntityFrameworkCore.SqlServer 3)输入命令 Install-Packag ...
- git命令使用(三)
git的使用--分支的使用 我们都知道拉取代码的时候,拉下来的是默认的分支,但我们需要的是,其他分支的使用操作 开始,拉取项目 git clone url 查看分支,显示默认分支 git branch ...