fzu 2019 排列

wrong了好多吧,注意边界

#include<iostream>
#include<cstring>
#include <cstdio>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include <set>
#include<ctime>
#include<cmath>
#include <cstdlib>
#include<algorithm>
#include <iomanip>
using namespace std;
#define LL __int64
#define N 200100
#define mid 100000
int ar[N],dp[N],hah[N];
int main(){
    int T,n,m;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        int id;
        for(int i=1;i<=n;i++){ 
            scanf("%d",&ar[i]);
            if(m==ar[i]) id=i; 
        }
        memset(dp,0,sizeof(dp));
        for(int i=id-1;i>0;i--){
            dp[i]=dp[i+1]; 
            if(ar[i]<m) dp[i]++;
        }
        for(int i=id+1;i<=n;i++){
            dp[i]=dp[i-1]; 
            if(ar[i]<m) dp[i]++;
        }

        int ans=0;

        memset(hah,0,sizeof(hah));
        int x=((id-1)&1 ? id+1:id);
        for(int i=x ;i<=n;i+=2){
            hah[ dp[i]-(i-x)/2 +mid]++;
        }
        for(int i=1;i<=id;i+=2){
            ans+=hah[ (x-i)/2-dp[i] +mid];
        }

        memset(hah,0,sizeof(hah));
        x=((id-2)&1 ? id+1:id);
        for(int i=x ;i<=n;i+=2) {
            hah[ dp[i]-(i-x)/2 +mid]++;
        }
        for(int i=2;i<=id;i+=2){
            ans+=hah[ (x-i)/2-dp[i] + mid];
        }
        printf("%d\n",ans);
    }
}
posted @ 2012-04-28 22:04  HaoHua_Lee  阅读(148)  评论(0编辑  收藏  举报