这题我tm服了,考试中途肯定添加了一组数据,提交完A了之后,还有20min结束,感觉写不了下一个题了,就下班了,谁知道它有填了一组测试数据把我的乱搞给卡过去了,我又被fst了???然后我有乱改了一下又A了,服了可惜排名掉了好多~~
D. Let’s Go Hiking
预处理几个数组乱搞讨论讨论即可。
#define IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<bitset>
#include<random>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
using ll=long long;
using pii=pair<int,int>;
using pli=pair<ll,int>;
constexpr ll mod=1e9+7;
constexpr int N=100010;
int a[N];
int n;
int fa[N];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int l[N],r[N];
int L[N],R[N];
int mL[N],mR[N];
int Ml[N],Mr[N];
void init(int n)
{for(int i=1;i<=n;i++) fa[i]=i;for(int i=2;i<=n;i++)if(a[i]>a[i-1]) fa[i]=find(fa[i-1]);for(int i=1;i<=n;i++) l[i]=find(fa[i]);for(int i=1;i<=n;i++) fa[i]=i;for(int i=n-1;i>=1;i--)if(a[i]>a[i+1]) fa[i]=find(fa[i+1]);for(int i=1;i<=n;i++) r[i]=find(fa[i]);for(int i=1;i<=n;i++) fa[i]=i;for(int i=2;i<=n;i++)if(a[i]<a[i-1]) fa[i]=find(fa[i-1]);for(int i=1;i<=n;i++) L[i]=find(fa[i]);for(int i=1;i<=n;i++) fa[i]=i;for(int i=n-1;i>=1;i--)if(a[i]<a[i+1]) fa[i]=find(fa[i+1]);for(int i=1;i<=n;i++) R[i]=find(fa[i]);for(int i=1;i<=n;i++) mL[i]=max(mL[i-1],i-L[i]+1);for(int i=n;i>=1;i--) mR[i]=max(mR[i+1],R[i]-i+1);for(int i=1;i<=n;i++) Ml[i]=max(Ml[i-1],i-l[i]+1);for(int i=n;i>=1;i--) Mr[i]=max(Mr[i+1],r[i]-i+1);}
int main()
{//IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];init(n);int res=0;for(int i=1;i<=n;i++){int x=l[i],y=r[i];int ml=i-l[i]+1;int mr=r[i]-i+1;if(max(ml,mr)<=max(mL[x],Ml[x])||max(ml,mr)<=max(Mr[y],mR[y])) continue;if(mL[x]==x-L[x]+1){if(max(ml-1,mr)<=mL[x]) continue;}if(mR[y]==R[y]-y+1){if(max(ml,mr-1)<=mR[y]) continue;}if(mr%2==0){if(mr>=ml) continue;}else{if(mr-1>=ml) continue;}if(ml%2==0){if(ml>=mr) continue;}else{if(ml-1>=mr) continue;}if(mr/2>=ml) continue;if(ml/2>=mr) continue;res++;}cout<<res<<'\n';}return 0;
}
我为啥现在那么喜欢写假代码???
要加油哦~