P3719 [AHOI2017初中组]rexp——递归模拟

P3719 [AHOI2017初中组]rexp

没有什么算法的题做起来真不适应,这道题深深讽刺了我想用栈维护匹配括号个数的想法;

递归解决就行了;

时刻注意函数返回值是什么,边界条件是什么;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
typedef double dd;
typedef long long ll;
ll n;
ll a[maxn];
ll id[maxn];

ll f[maxn],g[maxn];

ll b1[maxn],b2[maxn];

int len;

ll query_front(int x)
{
    ll ans=0;
    for(;x;x-=x&(-x)) ans=max(b1[x],ans);
    return ans;
}

ll query_back(int x)
{
    ll ans=0;
    for(;x;x-=x&(-x)) ans=max(b2[x],ans);
    return ans;
}

void  add_front(int x,ll y)
{
    for(;x<=len;x+=x&(-x)) b1[x]=max(b1[x],y);
}

void add_back(int x,ll y)
{
    for(;x<=len;x+=x&(-x)) b2[x]=max(b2[x],y);
}

dd ans;

int qw[maxn];

int main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        id[i]=a[i];
    }
    sort(id+1,id+n+1);
    len=unique(id+1,id+n+1)-id-1;
    for(int i=1;i<=n;i++) qw[i]=lower_bound(id+1,id+len+1,a[i])-id;
    for(int i=1;i<=n;i++)
    {
        f[i]=query_front(qw[i]-1)+a[i];
        g[n-i+1]=query_back(qw[n-i+1]-1)+a[n-i+1];
        add_front(qw[i],f[i]);
        add_back(qw[n-i+1],g[n-i+1]);
    }
    for(int i=1;i<=n;i++)
    {
        ans=max(ans,max((dd)f[i],((dd)f[i]+(dd)g[i]-(dd)a[i])/2.0));
    }
    printf("%.3lf",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/WHFF521/p/11730078.html

时间: 2024-11-05 03:39:11

P3719 [AHOI2017初中组]rexp——递归模拟的相关文章

[AHOI2017初中组]guide

[AHOI2017初中组]guide 最短路 题意 对于一张有向图,每条边有两个边权,有两套GPS会分别按两个边权计算所在到终点的最短路,如果你不按其中一套GPS说的路走,就会产生1的抱怨,求从起点到终点的最少抱怨数 题解 因为每次两套GPS都会判断当前要去的点是否在当前点到终点的最短路上,所以我们可以反向建边,跑出每套GPS从终点到每个点的最短路,然后我们重新建图,依次枚举原图的每条边,将边权赋值为2,如果要去的点在某套GPS的最短路上,边权减一.最后跑一遍最短路就可以得出\(ans\) 反向

uva 10795 A Different Task(递归模拟)

uva 10795 A Different Task The (Three peg) Tower of Hanoi problem is a popular one in computer science. Briefly the problem is to transfer all the disks from peg-A to peg-C using peg-B as intermediate one in such a way that at no stage a larger disk

luogu3720 [AHOI2017初中组]guide[最短路]

初中组..唉 题意有点误解,当前在x点走一步,gps产生代价条件是沿非x到n的最短路走. 直接倒着跑两遍$i\sim n$的两种最短路,然后枚举每条边走的时候是否可以在两种最短路上,不是就产生1个代价,然后以这个代价重新建图正着跑一遍最短路即可. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6

P3717 [AHOI2017初中组]cover

题目背景 以下为不影响题意的简化版题目. 题目描述 一个n*n的网格图上有m个探测器,每个探测器有个探测半径r,问这n*n个点中有多少个点能被探测到. 输入输出格式 输入格式: 第一行3个整数n,m,r 接下来m行,每行两个整数x,y表示第i个探测器的坐标 输出格式: 能被探测到的点的个数 输入输出样例 输入样例#1: 5 2 1 3 3 4 2 输出样例#1: 8 说明 1<=n,m<=100 太水了,不用差分就过了. #include<iostream> #include<

Luogu P3717 [AHOI2017初中组]cover

题目背景 以下为不影响题意的简化版题目. 题目描述 一个n*n的网格图上有m个探测器,每个探测器有个探测半径r,问这n*n个点中有多少个点能被探测到. 输入输出格式 输入格式: 第一行3个整数n,m,r 接下来m行,每行两个整数x,y表示第i个探测器的坐标 输出格式: 能被探测到的点的个数 输入输出样例 输入样例#1: 5 2 1 3 3 4 2 输出样例#1: 8 说明 1<=n,m<=100 Solution 水题-- 既然是水题,也就没有多考虑就做了,可能时空复杂度不是最低的,但也不想管

P3720 [AHOI2017初中组]guide

题目描述 农场主John最近在网上买了一辆新车,在购买汽车配件时,John不小心点了两次“提交”按钮.导致汽车上安装了两套GPS系统,更糟糕的是John在使用GPS导航时,两套系统常常给出不同的路线.从地图上看,John居住的地区有N(2 ≤ N ≤ 100,000)个十字路口和M(1 ≤ M ≤ 500,000)条限定通行方向的道路.第i条道路连接路口 A_i (1 ≤ A_i ≤ N)和B_i (1 ≤ B_i ≤ N),两个路口之间可能连接有多条道路.允许双向通?的道路是将两条单向通?的道

C语言::模拟实现strlen函数

编写一个C语言程序模拟实现strlen函数. 算法 strlen函数功能是计算字符串中字符的个数.(除\0外) 而字符串本身就是一个字符数组,只不过末尾以\0结束. 因此,我们只需遍历除\0之外的所有字符即可. 有三种方法可以解决这个问题. 算法总结 方法一:设置一个整型计数器,遍历字符串. 方法二:通过不断函数自身的递归. 方法三:与方法一类似,设置一个char*变量标记字符串尾部,通过指针相减得到字符长度. 核心代码 //方法一:通过设置整型计数器,模拟实现strlen函数. int my_

《数据结构与算法分析》递归简论

1.当一个函数用它自己来定义时就称为递归的.C允许函数是递归的.但重要的是:C提供的仅仅是遵循递归思想的一种企图.不是所有的数学递归函数都能有效地(或正确地)由C的递归模拟来实现. int Bad(unsigned int N) { if (N == 0) { return 0; } else { return Bad(N / 3 + 1) + N - 1; } } 在以上例子中,计算机将会反复调用Bad(1)以期解出它的值.最后计算机薄记系统将占满空间,程序崩溃. 注意:实际上,递归调用在处理

hdu 4964 Emmet(模拟)

题目链接:hdu 4964 Emmet 题目大意: 给定语句,按照语法翻译并输出. 解题思路:用递归模拟文法分析,主要注意几点: 括号并且的情况:(fuck)(you) 括号嵌套的情况:((fuck.you)) 优先输出id,然后是class(题目中有说) 乘法的部分:fuck*2>you*3 (每次执行fuck时,you的地方同样被执行了3次) 其他跑出样例基本没问题,具体看代码. #include <cstdio> #include <cstring> #include