《求助Help》
  • 板块灌水区
  • 楼主xu_zhihao
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/11/26 17:48
  • 上次更新2023/11/26 20:04:02
查看原帖
《求助Help》
1063855
xu_zhihao楼主2023/11/26 17:48

理解题目:

  • 因为求值的是区间是 [li,ri][l_{i},r_{i}],所以就可以把题目理解为,给你 nn 个数 aia_{i},让你求取出 ri−li+1r_{i}-l_{i}+1 个数字,能否让这 ri−li+1r_i-l_i+1 个数字 的和为 00。

  • 我们可以用一个桶来把两种数字出现的个数记录下来。

  • 因为有 ai=−1,1a_i=-1,1 的特性,所以如果想要使 ri−li+1r_i-l_i+1 个数字总和为零,那么这两种数在这 ri−li+1r_i-l_i+1 个数字中的数量要是相等的。

  • 代码中可以先判断 ri−li+1r_i-l_i+1 的奇偶性,因在 ri−li+1r_i-l_i+1 为奇数时,两种数在这 ri−li+1r_i-l_i+1 个数字中的数量肯定是不相等的。

  • 再判断 nn 个数中,这两种数字其中的一个是否都大于 12(ri−li+1)\frac{1}{2}(r_i-l_i+1) 个,如果是一定能找到合法方案。

  • 最后的他情况,也就是这两种数字至少其中一个不大于 12(ri−li+1)\frac{1}{2}(r_i-l_i+1) 个,代表不可能找到合法方案。

  • 注意要用快读与快输,不然会 TLE。


AC 代码:

#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;
}

这个题解哪里有多余空格啊?

2023/11/26 17:48
加载中...