关闭

hdu 6047 Maximum Sequence

标签: 优先队列
384人阅读 评论(0) 收藏 举报
分类:

http://acm.hdu.edu.cn/showproblem.php?pid=6047

题意,给定一个数组{an}和一个数组{bn},按照一定规则生成{a2n},规则是:aimax{ajj|bkj<i},每一个bk只能选择一次。

例如样例:

4
8 11 8 5
3 1 4 2

选择a5的时候,前四个为7 9 5 1,选择b2a5=9
选择a6的时候,前五个为7 9 5 1 4,选择b4a6=9
选择a7的时候,前五个为7 9 5 1 4 3,选择b1a7=5
选择a8的时候,前五个为7 9 5 1 4 3 -2,选择b3a8=4

2ni=n+1ai最大为27。

考虑用一个优先队列维护aii以及其下标,然后按照{bn}升序排序,对于队列中下标大于bi的选择出队,然后选择队首作为ai+n的值。

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll MOD = 1e9+7;
int a[300000];
int b[300000];

struct node{
    int a,id;
};

struct cmp{
    bool operator ()(const node &a,const node &b){
        return a.a<b.a;
    }
};

priority_queue< node ,vector<node > ,cmp> Q;

int main(){
    int n;
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++)
            scanf("%d",a+i);
        for(int i=1;i<=n;i++)
            scanf("%d",b+i);
        for(int i=1;i<=n;i++)
            a[i]-=i;
        int tmx = a[n];       
        while(!Q.empty()) Q.pop();
        sort(b+1,b+1+n);
        ll ans = 0;
        for(int i=1;i<=n;i++){
            Q.push(node{a[i],i});    
        }
        int t=0;
        for(int i=n+1;i<=n+n;i++){
            while(Q.top().id<b[i-n]) Q.pop();
            node now = Q.top();
            ans += now.a;
            ans %= MOD;
            Q.push(node{now.a-i,i});
        }
        cout<<ans<<endl;
    }
    return 0;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

HDU1003 Max Sum 最大子序列和的问题【四种算法分析+实现】

就拿杭电OJ上的第1003题开始吧,这题比原书要复杂一些。 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your ...
  • u012846486
  • u012846486
  • 2014-05-18 21:08
  • 1440

Leetcode全数字问题

目录 1、编号7 Reverse digits of an integer. 2、编号8 Stringto Integer ATOI 3、编号10 Container With Most Water ...
  • wangxiaojun911
  • wangxiaojun911
  • 2014-02-07 12:05
  • 2663

HDU 1003 解题报告

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...
  • u013341274
  • u013341274
  • 2014-05-24 19:09
  • 2596

2017 多校训练第二场 HDU 6047 Maximum Sequence(贪心+优先队列)

Maximum Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others...
  • Timeclimber
  • Timeclimber
  • 2017-12-13 19:12
  • 85

2017 杭电多校联赛第二场 1003 Maximum Sequence(单调队列)HDU 6047

Maximum Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)...
  • yiya_eryi
  • yiya_eryi
  • 2017-07-27 17:24
  • 333

2017 Multi-University Training Contest - Team 2:1003&hdu6047、Maximum Sequence

题目: Maximum Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot...
  • qq_32360995
  • qq_32360995
  • 2017-07-27 18:05
  • 187

HDU6047-Maximum Sequence

Maximum SequenceTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
  • algzjh
  • algzjh
  • 2017-08-01 10:54
  • 132

2017多校联合二1003(hdu6047)Maximum Sequence

Maximum Sequence 预处理:a_i -= i ,易证明从最小的b开始选每次选最大的一定可以使结果最大。 证明思路:如果条件改为a_i<=max{a_j-j|b_k<=j<=n},那...
  • The_star_is_at
  • The_star_is_at
  • 2017-07-29 11:04
  • 128

HDU - 6047 多校2 1003 Maximum Sequence (贪心+优先队列)

Steph is extremely obsessed with “sequence problems” that are usually seen on magazines: Given the s...
  • zyd8888102
  • zyd8888102
  • 2017-07-28 11:06
  • 93

Hdu 6047 Maximum Sequence【贪心+优先队列】

Maximum Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)...
  • mengxiang000000
  • mengxiang000000
  • 2017-07-27 21:32
  • 168
    个人资料
    • 访问:18789次
    • 积分:656
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:2篇
    • 译文:0篇
    • 评论:11条
    文章分类