分块
看到没有写分块的,那我就写一篇分块的题解
这道题很像P4145,都是暴力修改+优化
对于修改操作和查询操作分类讨论:
-
修改
修改很简单,直接单点修改并更新区间lazy标记(区间gcd值)
-
查询
显然,对于区间内不能被x整除的数的个数大于1时显然怎么改也不能符合要求。
所以我们只要查询区间内不能被x整除的数的个数就好了
那么如何把区间gcd值改为不能被x整除的数呢?
我们容易知道,如果区间gcd值 m o d x = 0 mod x=0 modx=0,那么这个区间里的数肯定都能被x整除
如果不等于0,就暴力遍历即可
优化
- 数据量比较大,使用快读
- 将频繁使用的循环变量改为register
- 查询时如果区间内不能被x整除的数的个数已经 > 2 >2 >2,就直接输出NO并return
这样就可以用分块通过本题啦
代码
#include<bits/stdc++.h>
using namespace std;
namespace FAST_IO
{
template<typename T> void read(T &a)
{
a=0;
int f=1;
char c=getchar();
while(!isdigit(c))
{
if(c=='-')
{
f=-1;
}
c=getchar();
}
while(isdigit(c))
{
a=a*10+c-'0';
c=getchar();
}
a