CodeForce 855B 暴力or线段树
CodeForce 855B 暴力or线段树
题意
给你一串数,然后找出三个数,他们的前后关系和原来一样,可以相同,然后分别乘p,q,r,求他们积的和最大,并且输出这个数。
解题思路
- 这个可以使用线段树来做,找出区间内的最小值和最大值,如果x(代表pqr中的一个)小于零,就乘以这个区间的最小值,如果大于零,就乘以这个区间的最大值。然后\(j\)从1到n开始遍历。
- 或者可以暴力,不过这个暴力比一点重方法还要好,我看完就惊呆了,lxm大佬太强了。
代码实现
第一种:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
#include<cmath>
# define ls (rt<<1)
# define rs (rt<<1|1)
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f3f3f3f3f; //注意这里是8个3f,用来初始化用,很重要。
const int maxn=1e5+7;
struct node{
int l, r;
ll ma, mi;
}t[maxn<<2];
ll num[maxn];
ll n, p, q, r;
void up(int rt)
{
t[rt].ma=max(t[rt<<1].ma, t[rt<<1|1].ma);
t[rt].mi=min(t[rt<<1].mi, t[rt<<1|1].mi);
}
void build(int rt, int l, int r)
{
t[rt].l=l;
t[rt].r=r;
if(l==r)
{
t[rt].ma=num[l];
t[rt].mi=num[l];
return ;
}
int mid=(l+r)>>1;
build(ls, l, mid);
build(rs, mid+1, r);
up(rt);
}
ll query_ma(int rt, int l, int r)//寻找区间最大值
{
if(l <= t[rt].l && t[rt].r <= r)
{
return t[rt].ma;
}
ll ans=-inf;
int mid=(t[rt].l+t[rt].r)>>1;
if(l<=mid) ans=max(ans, query_ma(ls, l, r));
if(r>mid) ans=max(ans, query_ma(rs, l, r));
return ans;
}
ll query_mi(int rt, int l, int r) //寻找区间最小值
{
if(l <= t[rt].l && t[rt].r <= r)
{
return t[rt].mi;
}
ll ans=inf;
int mid=(t[rt].l+t[rt].r)>>1;
if(l<=mid) ans=min(ans, query_mi(ls, l, r));
if(r>mid) ans=min(ans, query_mi(rs, l, r));
return ans;
}
int main()
{
while(scanf("%lld%lld%lld%lld", &n, &p, &q, &r)!=EOF)
{
for(int i=1; i<=n; i++)
{
scanf("%lld", &num[i]);
}
build(1, 1, n);
ll ans=-inf, tmp=0;
for(int i=1; i<=n; i++) //遍历,这里的i就是题目中的j
{
tmp=0;
if(p<=0)
{
tmp+=p*query_mi(1, 1, i);
}
else tmp+=p*query_ma(1, 1, i);
tmp+=q*num[i];
if(r<=0)
{
tmp+=r*query_mi(1, i, n);
}
else tmp+=r*query_ma(1, i, n);
ans=max(ans, tmp);
}
printf("%lld\n", ans);
}
return 0;
}
第二种:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll inf=0x3f3f3f3f3f3f3f3f;
int main()
{
ll n, p, q, r, x;
scanf("%lld%lld%lld%lld", &n, &p, &q, &r);
ll m1=-inf, m2=-inf, m3=-inf;
for(int i=1; i<=n; i++) //太巧妙了!
{
scanf("%lld", &x);
m1=max(m1, x*p);
m2=max(m2, m1+x*q);
m3=max(m3, m2+x*r);
}
printf("%lld\n", m3);
return 0;
}
CodeForce 855B 暴力or线段树的更多相关文章
- CDOJ 1292 卿学姐种花 暴力 分块 线段树
卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一 ...
- HDU - 4366 Successor DFS序 + 分块暴力 or 线段树维护
给定一颗树,每个节点都有忠诚和能力两个参数,随意指定一个节点,要求在它的子树中找一个节点代替它,这个节点要满足能力值大于它,而且是忠诚度最高的那个. 首先,dfs一下,处理出L[i], R[i]表示d ...
- HDU - 6183 暴力,线段树动态开点,cdq分治
B - Color itHDU - 6183 题目大意:有三种操作,0是清空所有点,1是给点(x,y)涂上颜色c,2是查询满足1<=a<=x,y1<=b<=y2的(a,b)点一 ...
- POJ 2182/暴力/BIT/线段树
POJ 2182 暴力 /* 题意: 一个带有权值[1,n]的序列,给出每个数的前面比该数小的数的个数,当然比一个数前面比第一个数小的个数是0,省略不写,求真正的序列.(拗口) 首先想到的是从前到后暴 ...
- 【BZOJ 4059】 (分治暴力|扫描线+线段树)
4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 632 Solved: 22 ...
- hdu 4007 暴力or线段树 ***
尼玛,INF不能定义太大,找标程对拍了好久 #include<cstdio> #include<iostream> #include<algorithm> #inc ...
- 【BZOJ4137】火星商店问题(线段树分治,可持久化Trie)
[BZOJ4137]火星商店问题(线段树分治,可持久化Trie) 题面 洛谷 BZOJ权限题 题解 显然可以树套树,外层线段树,内层可持久化Trie来做. 所以我们需要更加优美的做法.--线段树分治. ...
- kb-07-RMQ线段树--07(动态规划)
RMQ是一类解决区间最值查询的算法的通称:.一共有四类:在代码中有说明: 下面是ST算法,就是动态规划做法: 来看一下ST算法是怎么实现的(以最大值为例): 首先是预处理,用一个DP解决.设a是要求区 ...
- [BZOJ3339] Rmq Problem(线段树)
传送门 这个题的方法好像很多啊 1.莫队暴力 2.线段树 + 离线处理 先预处理出sg[i]表示前i个数的sg值,next[i]表示i的下一位置在哪里,如果后面再没有i,那么next[i] = n + ...
随机推荐
- Maven项目jar和war部署
Spring Boot可以打成jar包,也可以打成war包.启动方式类有main函数做为入口,比如:java -jar xxx.jar.Spring Boot默认内置Tomcat服务器,当然也可以将w ...
- Pool数据池
sql相关请点我!!! 1.普通的sql语句查询完成之后,就要断开,下次查的时候又要重新开启,这样的话,效率会很低,所以利用pool 数据池来解决这种问题,pool数据池查询完之后,就不用去重新链接数 ...
- 【Luogu4191】[CTSC2010] 性能优化
题目链接 题意简述 求循环卷积意义下的 \(A(x)*B(x)^C\). 模数为 n+1 ,长度为 n. Sol 板子题. 循环卷积可直接把点值快速幂来解决. 所以问题就是要快速 \(DFT\),由于 ...
- Python---进阶---logging---装饰器打印日志
#### logging - logging.debug - logging.info - logging.warning - logging.error - logging.critical --- ...
- py-R-FCN的caffe配置(转)
参考:https://blog.csdn.net/wei_guo_xd/article/details/74451443 下载程序,git clone https://github.com/Orpin ...
- SpringBoot路径映射
当然这个功能并非是springboot特有的,只是springboot提供了更简便的方法以供使用. 传统情况下我们跳转一个动态页面且并没有数据,也需要在controller中写一个跳转的con ...
- 为什么阿里巴巴要禁用Executors创建线程池?
作者:何甜甜在吗 juejin.im/post/5dc41c165188257bad4d9e69 看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executors去创建,而是通过ThreadP ...
- size_t是什么?
在32位编译器下size_t可看做unsigned int: 在64位编译器下size_t可看做unsigned long long: sizeof返回的数据类型就为size_t. C++之size_ ...
- BM板子
BM线性递推 玄学玩意 struct LinearRecurrence { using int64 = long long; using vec = std::vector<int64>; ...
- [CSP-S模拟测试]:木叶下(图论)
题目传送门(内部题77) 输入格式 第一行一个整数$n$,表示原先的树的点数接下来$n-1$行每行两个整数$a,b$,表示原先的树上的$n-1$条边,保证这$n-1$条边形成一棵树. 接下来一行一个整 ...