首页 > 其他分享 >JOI Open 2019 Triple Jump 题解

JOI Open 2019 Triple Jump 题解

时间:2024-11-03 17:58:11浏览次数:4  
标签:max ch int 题解 最大值 Jump 2019 ans define

原题链接

可以暴力枚举 \(a,b\),然后 \(c\in [2b-a,n]\),找区间最大值即可。

对于我们选择的 \(a,b\) 间,若能在 \((a,b)\) 中找到某个下标 \(i\),满足 \(h_i\ge h_a\) 或 \(h_i\ge h_b\),那么选择 \(i\) 是更优的。

理由很简单,无论是从 \(a\to i\) 还是从 \(b\to i\),都会扩大 \(c\) 的选择区间,同时还能增大你的 \(h_a+h_b\)。

所以我们只找满足以下条件的 \(a,b\):

  • \([a,b]\) 中最大值 \(< \min\{h_a,h_b\}\)。

这不就是找到一个数,它左右两边的最近的大于等于它的数吗。直接单调栈求出,并且这样的数对是 \(O(n)\) 级别的。

然后我们把询问离线下来,从大到小枚举左端点进行扫描线,对于新的左端点 \(i\),先把预处理来的数对 \((a,b),a=i\) 对答案进行更新。

如何维护答案?考虑线段树,设 \(B_i\) 表示如果选 \(i\) 作为 \(c\),它左边的最大的 \(h_a+h_b\),对于新来的数对 \((a,b)\),将 \([2b-a,n]\) 中的 \(B_i\) 与 \(h_a+h_b\) 取 \(\max\),这个用线段树很好维护。

对于左端点为 \(i\) 的所有询问,查询区间 \([i+2,r]\) 的 \(B_i+h_i\) 的最大值。

所以线段树维护 \(h_i,B_i+h_i\) 的最大值,支持与某个数取 \(\max\) 操作,这道题就做完了。

时间复杂度 \(O((n+q)logn)\)。

Code:

#include<bits/stdc++.h>
using namespace std;
#define rd read()
#define PII pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define ll long long
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define ROF(i,j,k) for(int i=j;i>=k;i--)
int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return x*f;
}
const int N=5e5+10,INF=2e9;
int n,q,stk[N],top,a[N],mx1[N<<2],mx2[N<<2],tag[N<<2],ans[N];
vector<int> v[N];vector<PII> que[N];
void pushdown(int u){
	tag[u<<1]=max(tag[u<<1],tag[u]),tag[u<<1|1]=max(tag[u<<1|1],tag[u]);
	mx2[u<<1]=max(mx2[u<<1],tag[u]+mx1[u<<1]),mx2[u<<1|1]=max(mx2[u<<1|1],tag[u]+mx1[u<<1|1]);
	tag[u]=0;
}
void build(int u,int l,int r){
	if(l==r){mx1[u]=mx2[u]=a[l];return;}
	int mid=(l+r)>>1;
	build(u<<1,l,mid),build(u<<1|1,mid+1,r);
	mx1[u]=mx2[u]=max(mx1[u<<1],mx1[u<<1|1]);
}
void modify(int u,int l,int r,int ql,int qr,int val){
	if(ql<=l&&r<=qr){
		tag[u]=max(tag[u],val),mx2[u]=max(mx2[u],mx1[u]+val);
		return;
	}
	pushdown(u);
	int mid=(l+r)>>1;
	if(ql<=mid) modify(u<<1,l,mid,ql,qr,val);
	if(qr>mid) modify(u<<1|1,mid+1,r,ql,qr,val);
	mx2[u]=max(mx2[u<<1],mx2[u<<1|1]);
}
int query(int u,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr) return mx2[u];
	pushdown(u);
	int mid=(l+r)>>1,ans=0;
	if(ql<=mid) ans=max(ans,query(u<<1,l,mid,ql,qr));
	if(qr>mid) ans=max(ans,query(u<<1|1,mid+1,r,ql,qr));
	return ans;
}
int main(){
	n=rd;FOR(i,1,n) a[i]=rd;
	a[0]=INF,top=1;
	FOR(i,1,n){
		while(a[stk[top]]<a[i]) v[stk[top--]].push_back(i);
		if(stk[top]) v[stk[top]].push_back(i);
		stk[++top]=i;
	}
	q=rd;
	FOR(i,1,q){int l=rd,r=rd;que[l].push_back(mp(r,i));}
	build(1,1,n);
	ROF(i,n-2,1){
		for(auto j:v[i]) if(2*j-i<=n) modify(1,1,n,2*j-i,n,a[i]+a[j]);
		for(auto j:que[i]) ans[j.se]=query(1,1,n,i+2,j.fi);
	}
	FOR(i,1,q) printf("%d\n",ans[i]);
	return 0;
}

标签:max,ch,int,题解,最大值,Jump,2019,ans,define
From: https://www.cnblogs.com/summ1t/p/18523709

相关文章

  • 关于深度学习模型不收敛问题解决办法
    1.问题重现笔者在训练Vgg16网络时出现不收敛问题,具体描述为训练集准确率和测试集准确率一直稳定于某一值,如下图所示。2.可能的原因2.1数据问题噪声数据。不平衡的数据集、含有噪声或异常值的数据可能导致模型难以学习,尝试更换数据集,出现这种问题比较难办。数据预处理......
  • Educational Codeforces Round 171 (Rated for Div. 2) 题解
    A.PerpendicularSegments显然构造一个\(k\timesk\)的左下角是原点的正方形即可。voidslv(){ intx,y,k;Read(x,y,k); intmn=min(x,y); if(mn*mn*2>=k*k) Write(0,'',0,'',mn,'',mn,'\n'), Write(0,......
  • AtCoder Beginner Contest 378 F题题解
    题目:F-AddOneEdge2思路:可以发现题目就是要我们找出有多少个点对满足连成后是一个简单环环上的点度都为3因为是一个简单图所以不可以有重边和自环那么就代表着这个环肯定是由两个度为2的点和大于1个度为3的点组成的注意到两个点的最近公共祖先一定可以跟这两个点形......
  • Codeforces Round 984 div3 个人题解(A~F)
    CodeforcesRound984div3个人题解(A~F)Dashboard-CodeforcesRound984(Div.3)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#include<cassert>#include<cmath>#in......
  • [RoarCTF 2019]Easy Calc
    题目链接:https://buuoj.cn/challenges#[RoarCTF2019]EasyCalc打开环境后如下所示。查看该页面的源代码,发现存在"calc.php"文件,同时,提示设置了WAF。访问"calc.php"文件,发现该页面打印出了PHP源码。即。<?phperror_reporting(0);if(!isset($_GET['num'])){s......
  • [极客大挑战 2019]BuyFlag
    题目链接:https://buuoj.cn/challenges#[极客大挑战2019]BuyFlag打开环境后如下所示。发现右侧中存在一个菜单,并有"PAYFLAG"选项卡,访问其后,响应包如下。HTTP/1.1200OKServer:openrestyDate:Fri,25Oct202415:00:41GMTContent-Type:text/html;charset=UTF-8Con......
  • [ZJCTF 2019]NiZhuanSiWei
    题目链接:https://buuoj.cn/challenges#[ZJCTF2019]NiZhuanSiWei打开环境后如下所示。<?php$text=$_GET["text"];$file=$_GET["file"];$password=$_GET["password"];if(isset($text)&&(file_get_contents($text,'r')===......
  • [极客大挑战 2019]PHP
    题目链接:https://buuoj.cn/challenges#[极客大挑战2019]PHP打开环境后如下所示。题目提示"有一个良好的备份网站的习惯",因此,尝试爆破一下可能的备份文件名(如:backup.zip、www.zip等)。发现该网站的备份文件名为"www.zip",下载后,主要有"index.php"与"class.php"两个源码文......
  • [极客大挑战 2019]BabySQL
    题目链接:https://buuoj.cn/challenges#[极客大挑战2019]BabySQL打开环境后如下所示。尝试以下几种方法的万能密码:不加单引号。加单引号。加双引号。发现加入了单引号后,有SQL错误提示,但是可以发现,题目似乎过滤了用户输入的"or"。接下来,尝试双写绕过。发现可以成......