因为求值的是区间是 [li,ri],所以就可以把题目理解为,给你 n 个数 ai,让你求取出 ri−li+1 个数字,能否让这 ri−li+1 个数字 的和为 0。
我们可以用一个桶来把两种数字出现的个数记录下来。
因为有 ai=−1,1 的特性,所以如果想要使 ri−li+1 个数字总和为零,那么这两种数在这 ri−li+1 个数字中的数量要是相等的。
代码中可以先判断 ri−li+1 的奇偶性,因在 ri−li+1 为奇数时,两种数在这 ri−li+1 个数字中的数量肯定是不相等的。
再判断 n 个数中,这两种数字其中的一个是否都大于 21(ri−li+1) 个,如果是一定能找到合法方案。
最后的他情况,也就是这两种数字至少其中一个不大于 21(ri−li+1) 个,代表不可能找到合法方案。
注意要用快读与快输,不然会 TLE。
#include<bits/stdc++.h>
using namespace std;
int a[200010];
int flag[10];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
flag[a[i]+1]++;
}
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
int len=r-l+1;
int u=len/2;
if(u+u!=len)
{
putchar('0');
}
else if(flag[2]>=u && flag[0]>=u)
{
putchar('1');
}
else
{
putchar('0');
}
putchar('\n');
}
return 0;
}
这个题解哪里有多余空格啊?