• 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;
    }
    
  • 相关阅读:
    Triangle
    Remove Duplicate Letters
    array 并不会被默认初始化
    Unique Binary Search Trees
    有些障碍的 unique path
    unique paths
    最长增长序列的长度(LIS)
    极其简单的复数类,只是不想再推演一遍复数四则运算
    安卓_11
    安卓_10
  • 原文地址:https://www.cnblogs.com/kalginamiemeng/p/Exam20191105-Night.html
Copyright © 2020-2023  润新知