我实在是不知道这两个代码 哪里有问题。。。
题目本质:对中位数的处理以及差分求前缀和
//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;
}