首页 > 其他分享 >【题解】洛谷P7286:「EZEC-5」人赢

【题解】洛谷P7286:「EZEC-5」人赢

时间:2024-11-12 19:09:08浏览次数:1  
标签:洛谷 EZEC int 题解 long P7286 ans 指针 define

P7286 「EZEC-5」人赢

可以想到对于每个数要找到比他大的数中下标最大的数,我们按照数的大小排序,我们维护原序列的一个指针,对于每个数如果比指针大那么就左移指针,可以思考下为什么:

指针上的数比现在这个数要小那比后面的数都小,于是我们左移指针直到大于这个数,可以发现我们也在一直维护下标最大值,复杂度为 \(O(n\log n)\)。

其实如果可以也可以用树状数组求,但是这题数据范围太大了。

#include <bits/stdc++.h>
#define int long long
#define re register 
#define ll long long
const int N=1e6+10;
using namespace std;

int n;
int a[N];
int ans=0;
int k[N];

struct ss{
	int val,id;
}b[N];

bool cmp(ss g,ss h){
	return g.val<h.val;
}

signed main(){
//	freopen("kingdom3.in","r",stdin);
//	freopen("a.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr); 
	cin>>n;
	
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i].id=i;
		b[i].val=a[i];
		ans=max(ans,a[i]*i);
	}
	sort(b+1,b+n+1,cmp);
	int r=n;
	for(int i=1;i<=n;i++){
		while(a[r]<b[i].val||r==b[i].id){
			r--;
		}
		ans=max(ans,(r+b[i].id)*b[i].val);
	}
	cout<<ans;
	return 0;
}

P7291 「EZEC-5」人赢 加强版

加强版必须 \(O(n)\),如果我们 \(i<j\) 并且 \(k_i<k_j\) 那么除了 \(x=j\) 我们选 \(j\) 总是最优的,有了这一点我们就从后向前枚举每一个数,同时维护最大值,更新时就找到离他最近的最大值。

为什么这样是对的,看图。

image

我们这时到了c本应该选a,他如果选b会怎么样。

已知 \(a>b>c\),\((x+y)\times b\) 一定优于 \((z+y)\times c\),因为此时第二个式子的数又不大同时下标和也不大,那如果 \(a>c>b\) 的话,\((z+y)\times b\)也不见得优到哪去,总结来说就是因为如果和后面的匹配更优,那后面的和这个相邻的匹配会比这个匹配更优。

#include <bits/stdc++.h>
#define int long long
#define ls p<<1
#define rs p<<1|1 
#define re register 
#define ll long long
const int N=1e7+10;
const int mod=998244353;
using namespace std;

int n;
int a[N];
int ans=0;

inline int get(int x,int y){
	return (x+y)*min(a[x],a[y]);
}
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
inline int read()
{
    char c=getchar();int x=0;bool f=0;
    for(;!isdigit(c);c=getchar())f^=!(c^45);
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    if(f)x=-x;return x;
}

signed main(){
//	freopen("kingdom3.in","r",stdin);
//	freopen("a.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr); 
	
	n=read();
	
	for(re int i=1;i<=n;i++){
		a[i]=read();
		ans=max(ans,a[i]*i);
	}
	int l=n;
	for(re int i=n-1;i>=1;i--){
		ans=max(ans,get(i,l));
		if(a[i]>a[l]){
			l=i;
		}
	}
	cout<<ans;
	return 0;
}

标签:洛谷,EZEC,int,题解,long,P7286,ans,指针,define
From: https://www.cnblogs.com/sadlin/p/18542450

相关文章

  • 洛谷 P1772 [ZJOI2006] 物流运输 做题记录
    很神经的一道题。令\(val_{i,j}\)表示从第\(i\)天到第\(j\)天每天都走一条道路,单次的最小花费。可以枚举\(\{i,j\}\)然后把在这个区间里的所有点设置成不可达,每一个\(\{i,j\}\)都可以用floyd算,时间复杂度\(O(n^2m^3)\)。令\(f_i\)表示第\(i\)天的最小花费,那么......
  • 洛谷解题日记||基础篇4
     #include<iostream>usingnamespacestd;intmain(){intn,m;cin>>n>>m;//计算所有矩形的数量longlongtotalRectangles=(longlong)(n*(n+1)/2)*(longlong)(m*(m+1)/2);//计算正方形的数量longlongt......
  • 【题解】洛谷P8346:最澄澈的空与海
    【题解】洛谷P8346:最澄澈的空与海猜结论题,本身其实很简单,在纸上画个差不多就能想出来,我一开始想二分图最大匹配,但是还是太大了,不可以。当一个二分图有且仅有一种解时,必定有节点的入度为\(1\)。我们想到有多种匹配的情况,可以想到如果这是一个环的情况,一个左边的点将他右边的点......
  • MX-S5 T1~T2 题解
    MX-S5题解A.王国边缘题目链接见到循环结构,先把下标转成从\(0\)开始,以方便用同余描述位置。倍增。用二元组来表示位置:\((u,v)\)表示第\(u\)个循环节的第\(v\)个位置。设\(f(i,j)\)表示从位置\((0,i)\)开始跳\(2^j\)次以后的位置。假设已经可以初始化\(f(i,......
  • CF 705 题解
    CF705题解AHulk模拟即可.BSpiderMan打sg表可以发现,奇数个球先手必败(sg=0),偶数先手必胜(sg=1).多个组合只要把sg值异或起来就好.CThor暴力模拟就可以了,用队列模拟.DAntMan结论:按照编号由小到大加入链表,每次尽量让答案最小贪心就是对的.若原来是......
  • 题解:洛谷 P5180 【模板】支配树
    在图论模拟赛被T4的有向图必经点硬控了\(10^9+7s\),写篇题解纪念一下。其实,求有向图的必经点,通法就是支配树。一些定义:支配点:在确定起点\(S\)的情况下,对于一个点\(k\),若存在\(x\),使得删除\(x\)以及与\(x\)连接的边后,\(x\)与\(k\),不再强连通,那么就称\(k\)为\(x......
  • 【题解】洛谷P3118: Moovie Mooving G
    洛谷P3118:MoovieMoovingG看到数据范围考虑状压,题目要求看的电影最少那就维护时间最大,我们设\(f_{i}\)为\(i\)状态最多可以看多久的电影,对于不在集合的点我们枚举转移。我们每个开始时间都对应一个截至时间,问能加入这个点,每个点花费时间是固定的,我们又要不间断所以我们找......
  • CF785D 题解
    CF题目luogu题目题解似乎清一色是同一个做法,这里给一个容斥的做法。首先枚举一个位置\(i\),设\([1,i]\)的左括号个数为\(p\),\([i+1,n]\)的右括号个数为\(q\),那么以\(i\)这个位置为分界点的合法括号数有\(\sum_{i=1}^{\min(p,q)}C_p^iC_q^i\)个。通过范德蒙德卷......
  • CF 1325 题解
    CF1325题解AEhAbAnDgCd有\(\gcd(1,x)=1,\text{lcm}(1,x)=x\),因此输出\(1x\).BCopyCopyCopyCopyCopy要求严格上升子序列,那么答案的上界当然是去重后的元素个数.能否取到上界呢?当然可以,每一段内选一个你想要的就可以了.CEhabandPath-eticMEXs发现\(0,......
  • 历年CSP-J初赛真题解析 | 2020年CSP-J初赛完善程序(34-43)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客(质因数分解)给出正整数n,请输出将n质因数分解的结果,结果从小到大输出。例如:输入n=120,程序应该输出22235,表示120=2×2×2×......