HDU 6047 Maximum Sequence

来源:互联网 发布:windows10装mac系统 编辑:程序博客网 时间:2024/06/06 04:49

题目地址
题意:给你两个序列,一个是A序列,一个是B序列,序列B告诉你你可以取max(a[i]-i)(b[j]<=i<=MAX),让你求出新添加的和为多少
思路:把A序列从后往前遍历,求出A[i]-i,每次对A[i]赋值的时候选取的是A[i]-i和A[i+1]的最大值,因为后面的如果大是一定能够选到的,然后再用一个变量去记录后面生成的有没有比前面大的,再更新那个变量,最后得出的和就是最大的了。

#include <iostream>#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#define N 250010#define M 510#define LL __int64#define inf 0x3f3f3f3f#define lson l,mid,ans<<1#define rson mid+1,r,ans<<1|1using namespace std;const LL mod = 1e9 + 7;const double eps = 1e-9;int a[N], b[N];int main() {    cin.sync_with_stdio(false);    int n;    while (cin >> n) {        for (int i = 1; i <= n; i++) {            cin >> a[i];            a[i] = a[i] - i;        }        for (int i = 1; i <= n; i++) {            cin >> b[i];        }        for (int i = n - 1; i > 0; i--) {            a[i] = max(a[i], a[i + 1]);        }        LL ans = 0;        int cnt = 0;        sort(b + 1, b + n + 1);        for (int i = 1; i <= n; i++) {            ans += max(cnt, a[b[i]]);            ans %= mod;            cnt = max(cnt, a[b[i]] - n - i);        }        cout << ans << endl;    }    return 0;}
原创粉丝点击