思路求调
查看原帖
思路求调
339335
cougarmace楼主2024/8/18 15:36

可以发现,公差仅能为1,2,n−11,2,n-1
当公差为其他数的时候,假设前半段的这个数是xx,那x−1,x+1,x+2……x-1,x+1,x+2……就会被后半段选择,显然后半段不构成等差数列
那么对应ii能对答案进行共享的无非就一下几种情况,记录p1p_1到pip_i的最大值为mxnmxn,最小值为mnnmnn
对于公差为n−1n-1,仅需特判p1,p2p_1,p_2是否一个是11,另一个是nn
对于公差为22,仅需在i=n/2i=n/2和i=n/2+1i=n/2+1的时候进行暴力
对于公差为11,仅需特判是否出现mxn==nmxn==n且mnn==n−i+1mnn==n-i+1,或者mnn==1mnn==1且mxn==imxn==i以上两种情况
若思路没问题,代码求调awa\

#include"bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<ll,ll>PLL;
const ll maxn=1e6+10,mod=998244353,inf=0x3f3f3f3f;
ll t;
void solve();
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>t;
    while(t--)solve();
    return 0;
}ll n,a[maxn],b[maxn],c[maxn],mxn,mnn,ans;
void solve(){
    cin>>n;
    mxn=0,mnn=inf,ans=0;
    for(int i=1;i<=n;i++)cin>>a[i],b[i]=0,c[i]=0;;
    for(int i=1;i<n;i++){
        mxn=max(mxn,a[i]);
        mnn=min(mnn,a[i]);
        if(i==2&&mxn==n&&mnn==1){
            ans++;
            //cout<<1<<' ';
            continue;
        }if((mxn==n&&mnn==n-i+1)||(mnn==1&&mxn==i)){
            ans++;
            //cout<<2<<i<<mxn<<mnn<<' ';
            continue;
        }if(i==n/2||i==n/2+1){
            for(int j=1;j<=i;j++){
                b[j]=a[j];
            }for(int j=i+1;j<=n;j++){
                c[j-i]=a[j];
            }stable_sort(b+1,b+i+1);
            stable_sort(c+1,c+n-i+1);
            ll p=1;
            for(int j=1;j<i;j++){
                p&=(b[j]==b[j+1]-2);
                // cout<<(b[j]==b[j+1]-2)<<' ';
            }for(int j=i+1;j<n;j++){
                p&=(c[j-i]==c[j-i+1]-2);
                //cout<<(c[j-i]==c[j-i+1]-2)<<' ';
            }if(p){
                ans++;
                //cout<<4<<i<<' ';
            }
        }
    }cout<<ans<<endl;
}
2024/8/18 15:36
加载中...