19-11-05-Night

我就是不行。

ZJ:

好像是因为郁闷了才咕掉的……

33
Miemeng 30
00:01:34
40
00:01:46
0
00:01:22
70
00:01:46

不记得当时怎么想的

T1只会暴力。

T2也是暴力。

T3连暴力都写错……

Tj解:

存个代码吧……

T1:

#include <iostream>
#include <cstring>
#include <cstdio>
#define N 5555555
#define LL long long

using namespace std;

int pn;
int arr[N];
int maxv,maxxv;
LL mxt,mxxt;
LL ans=0;
struct Myqueue{
	int A[2*N],f,b;
	void clear(){f=b=0;}
	void push(const int k){A[b++]=k;}
	void pop_front(){f++;}
	void pop_back(){b--;}
	int& front(){return A[f];}
	int& back(){return A[b-1];}
	bool empty(){return f==b;}
	int size(){return b-f;}
}q,id,sam;
int main(){
#ifndef LOCAL
	freopen("jolyne.in" ,"r",stdin);
	freopen("jolyne.out","w",stdout);
#endif
	cin.sync_with_stdio(false);
	cin>>pn;
	for(int i=1;i<=pn;i++){
		cin>>arr[i];
		if(arr[i]>maxv){
			maxxv = maxv;
			maxv  = arr[i];
		}
		else if(arr[i]!=maxv && arr[i]>maxxv){
			maxxv = arr[i];
		}
	}
//	cout<<maxv<<" "<<maxxv<<endl;
	for(int i=1;i<=pn;i++){
		if(maxv  == arr[i]) mxt ++;
		if(maxxv == arr[i]) mxxt++;
	}
//	cout<<mxt<<" "<<mxxt<<endl;
	for(int i=1;i<=pn;i++){
		while(!q.empty() && arr[i] > q.back()){
			q.pop_back();
			id.pop_back();
			sam.pop_back();
		}
		if(!q.empty() && q.back()==arr[i])
			sam.push(sam.back()+1);
		else sam.push(1);
		id.push(i);
		q .push(arr[i]);
	}
	for(int i=1;i<=pn;i++){
		int is_s=0;
		while(!q.empty() && id.front()<=i){
			is_s=arr[i]==q.front();
			q.pop_front();
			id.pop_front();
			sam.pop_front();
		}
		while(!q.empty() && q.back() < arr[i]){
			q.pop_back();
			id.pop_back();
			sam.pop_back();
			ans++;
		}
		if(!q.empty() && q.back() == arr[i])
			sam.push(sam.back()+1);
		else sam.push(1);
		id.push(pn+i);
		q.push(arr[i]);
		if(q.size()==1 || q.front() != q.back())
			is_s=0;
		int va=sam.back();
		sam.pop_back();
		sam.push(va-is_s);
		ans+=sam.back()-1;
		if(q.front() != arr[i]){
			ans++;
		}
	}
	if(mxt==1)ans-=mxxt;
	else ans-=mxt*(mxt-1)/2;
	cout<<ans<<endl;
}

T2:

简单线性dp,作为dpsb又跪了=。=

#include <iostream>
#include <cstring>
#include <cstdio>
#define N 1111111
#define LL long long

using namespace std;

const int Mod=1e9+7;
int sl;
int arr[N];
LL dp[N],sum[N];

int main(){
#ifndef LOCAL
	freopen("rideon.in" ,"r",stdin);
	freopen("rideon.out","w",stdout);
#endif
	cin.sync_with_stdio(false);
	cin>>sl;
	for(int i=1;i<=sl;i++)
		cin>>arr[i];
	for(int i=1;i<=sl;i++){
		dp[i] =(sum[i-1]%Mod-sum[arr[i]-1]%Mod+Mod+2)%Mod;
		sum[i]=(sum[i-1]+dp[i])%Mod;
	}
	cout<<sum[sl]<<endl;
}

 

posted @ 2019-11-06 08:33  Miemeng_麦蒙  阅读(118)  评论(0编辑  收藏  举报

小麦在雨中,蒙蒙的雾气

麦蒙不想有人骚扰他,如果有必要 联系 QQ:1755601414

如果你嫌广告大,那就喷我吧,不是博客园的锅。