时间: 2020-11-23|63次围观|0 条评论

跟之前做过的51Nod的移数博弈是一样的QAQ

我们考虑每个数的贡献

定义其左边第一个比他小的数的位置为L

定义其右边第一个比他小的数的位置为R

这个可以用排序+链表 或者 单调队列 搞定

那么对于区间长度1->(R-L-1),该数都可以作为最小值出现

我们在R-L-1上打上标记,最后从后往前来更新答案即可

至此问题得解

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;

const int maxn=200010;
int n;
struct Num{
	int v,p;
}A[maxn],B[maxn];

int nxt[maxn],pre[maxn];
int mx[maxn],ans[maxn];

bool cmp(const Num &A,const Num &B){return A.v>B.v;}
void del(int now){
	nxt[pre[now]]=nxt[now];
	pre[nxt[now]]=pre[now];
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&A[i].v);A[i].p=i;
		B[i]=A[i];
	}
	sort(B+1,B+n+1,cmp);
	for(int i=1;i<=n;++i)nxt[i]=i+1,pre[i]=i-1;
	pre[0]=0;nxt[n+1]=n+1;
	for(int i=1;i<=n;++i){
		int now=B[i].p;
		int L=pre[now],R=nxt[now];
		mx[R-L-1]=max(mx[R-L-1],B[i].v);
		del(now);
	}
	for(int i=n;i>=1;--i)ans[i]=max(ans[i+1],mx[i]);
	for(int i=1;i<=n;++i)printf("%d ",ans[i]);
	return 0;
}

  

转载于:https://www.cnblogs.com/joyouth/p/5352932.html

原文链接:https://blog.csdn.net/weixin_30342827/article/details/98940936

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《codeforces #305 B Mike and Feet
   

还没有人抢沙发呢~