我实在是不知道这两个代码 哪里有问题。。。

题目本质:对中位数的处理以及差分求前缀和

 //1>
 #include <bits/stdc++.h>
 using namespace std;
 int a[100010];
 int main()
 {
     int n,b;
     scanf("%d%d",&n,&b);
     int pos = 0;
     for(int i = 1; i <= n; i++)
     {
         int x;
         scanf("%d",&x);
         if(x > b) a[i] = 1;
         if(x == b)
         {
             a[i] = 0;
             pos = i;
         }
         if(x < b) a[i] = -1;
     }
 //     for(int i = 1 ; i <= n; i++)
 //         cout<<a[i]<<" ";
 //     cout<<endl;
     int cnt[100010];
     int sum1 = 0; int sum2 = 0;
     for(int i = pos - 1; i >= 1; i--)
     {
         sum1 += a[i];
         cnt[i] = sum1;
     }
     for(int i = pos + 1; i <= n; i++)
     {
         sum2 += a[i];
         cnt[i] = sum2;
     }
 //     for(int i = 1 ; i <= n; i++)
 //         cout<<cnt[i]<<" ";
     int count = 0;
     for(int i = pos - 1,j = pos + 1; i >= 1, j <= n; i--,j++)
     {
         if(cnt[i] == 0)
             count++;
         if(cnt[j] == 0)
             count++;
     }
     for(int i = pos + 1; i <= n; i++)
     {
         for(int j = pos - 1; j >= 1; j--)
         {
             if(cnt[i] + cnt[j] == 0)
                 count++;
         }
     }
     cout<<(count+1);
 }


//2>
 #include <bits/stdc++.h>
 using namespace std;
 int a[100010];
 int main()
 {
     int n,b;
     scanf("%d%d",&n,&b);
     int pos = 0;
     for(int i = 1; i <= n; i++)
     {
         int x;
         scanf("%d",&x);
         if(x > b) a[i] = 1;
         if(x == b)
         {
             a[i] = 0;
             pos = i;
         }
         if(x < b) a[i] = -1;
     }
     int num[100010];
     int ans = 1;
     int sum1 = 0; int sum2 = 0;
     for(int i = pos - 1; i >= 1; i--)
     {
         sum1 += a[i];
         num[sum1]++; //记录下 0 -1 1的个数
         if(sum1 == 0) ans++;
     }
     //统计完左边的0 -1 1的个数之后 开始对右边进行匹配
     for(int i = pos + 1; i <= n; i++)
     {
         sum2 += a[i];
         ans = ans + num[-sum2]; //负号是为了匹配进行互补 正好为相反数时 符合情况
         if(sum2 == 0) ans++;
     }
     cout<<ans;
 }

我人傻了 原来是输入的时候就出现了问题。。。还有数组下标为负数的问题。但是好像不避免也不会出错???C++允许负数的出现

AC代码:

using namespace std;
const int N = 1e6 + 10;
int a[N],num[N];
int main()
{
    int n,b;
    scanf("%d%d",&n,&b);
    int pos = 0;
    for(int i = 1; i <= n; i++)
    {
        cin>>a[i];
        if(a[i] > b) 
            a[i] = 1;
        else if(a[i] < b) a[i] = -1;
        else pos = i;
    }
//     for(int i = 1; i <= n; i++)
//         cout<<a[i]<<" ";
    int ans = 1;
    int sum1 = 0; 
    for(int i = pos - 1; i >= 1; i--)
    {
        sum1 += a[i];
        num[sum1+1]++; //记录下 0 -1 1的个数
        if(!sum1) ans++;
    }
//     cout<<ans<<endl;
    //统计完左边的0 -1 1的个数之后 开始对右边进行匹配
    int sum2 = 0;
    for(int i = pos + 1; i <= n; i++)
    {
        sum2 += a[i];
        ans += num[1-sum2]; //负号是为了匹配进行互补 正好为相反数时 符合情况
        if(!sum2) ans++;
    }
    cout<<ans;
    return 0;
}