线段树求调
  • 板块CF474F Ant colony
  • 楼主zhjzhmh
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/5 10:14
  • 上次更新2023/10/27 16:56:39
查看原帖
线段树求调
233815
zhjzhmh楼主2022/8/5 10:14
#include<bits/stdc++.h>
using namespace std;
long long n,m,x,y,a[100010];
struct node
{
	long long l,r,gcd,min,minnum;
}tree[4000010];
struct Node
{
	long long min,num;
};
void build(long long x,long long l,long long r)
{
	tree[x].l=l,tree[x].r=r;
	if(r==l) tree[x].gcd=a[l],tree[x].min=a[l],tree[x].minnum=1;
	else
	{
		long long mid=(l+r)/2;
		build(x<<1,l,mid);
		build((x<<1)|1,mid+1,r);
		tree[x].gcd=__gcd(tree[x<<1].gcd,tree[(x<<1)|1].gcd);
		if(tree[x<<1].min==tree[(x<<1)|1].min) tree[x].min=tree[x<<1].min,tree[x].minnum=tree[x<<1].minnum+tree[(x<<1)|1].minnum;
		  else {long long u=min(tree[x<<1].min,tree[(x<<1)|1].min);tree[x].min=u;tree[x].minnum=(u==tree[x<<1].min?tree[x<<1].minnum:tree[(x<<1)|1].minnum);}
	}
}
Node query(long long x,long long l,long long r)
{
	if(l<=tree[x].l&&tree[x].r<=r) return (Node){tree[x].min,tree[x].minnum};
	else
	{
		Node ans1=(Node){0x3f3f3f3f,0},ans2=(Node){0x3f3f3f3f,0};
		long long mid=(tree[x].l+tree[x].r)/2;
		if(l<=mid) ans1=query(x<<1,l,mid);
		if(mid<r) ans2=query((x<<1)|1,mid+1,r);
		if(ans1.min==ans2.min) return (Node){ans1.min,ans1.num+ans2.num};
		  else {long long u=min(ans1.min,ans2.min);return (Node){u,ans1.min==u?ans1.num:ans2.num};}
	}
}
long long Query(long long x,long long l,long long r)
{
	if(l<=tree[x].l&&tree[x].r<=r) return tree[x].gcd;
	else
	{
		long long ans1=0,ans2=0;
		long long mid=(tree[x].l+tree[x].r)/2;
		if(l<=mid) ans1=Query(x<<1,l,mid);
		if(mid<r) ans2=Query((x<<1)|1,mid+1,r);
		if(ans1==0) return ans2;
		if(ans2==0) return ans1;
		return __gcd(ans1,ans2);
	}
}
long long ask(long long l,long long r)
{
	Node mn=query(1,l,r);int gcd=Query(1,l,r);
	if(mn.min==gcd) return mn.num;
	  else return 0;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);cin>>m;
	for(int i=1;i<=m;i++)
	{
		scanf("%lld%lld",&x,&y);
		printf("%lld\n",y-x+1-ask(x,y));
    }
	return 0;
}

RT,WA on test 2,有一行应该输出0我输出了1

2022/8/5 10:14
加载中...