我就是不行。
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; }