分块0pts求调
  • 板块P1840 Color the Axis
  • 楼主wmrqwqal & su
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/17 20:56
  • 上次更新2023/11/17 22:02:45
查看原帖
分块0pts求调
820056
wmrqwqal & su楼主2023/11/17 20:56
#include<bits/stdc++.h>
using namespace std;
long long n,m,x,y,gs,a[200010],b[200010],l[200010],r[200010],sum[200010],sq;
void upd(long long x)
{
	sum[x]=0;
	for(int i=l[x];i<=r[x];i++)
		if(a[i])
			sum[x]++;
	return ;
}
void add(long long x,long long y)
{
	if(b[x]==b[y])
	{
		for(int i=x;i<=y;i++)
			a[i]=1;
		upd(b[x]);
		return ;
	}
	for(int i=x;i<=r[b[x]];i++)
		a[i]=1;
	for(int i=l[b[y]];i<=y;i++)
		a[i]=1;
	upd(b[x]);
	upd(b[y]);
	for(int i=b[x]+1;i<=b[y]-1;i++)
		if(sum[i]!=sq)
			sum[i]=sq;
	return ;
}
void query()
{
	long long ans=0;
	for(int i=1;i<=gs;i++)
		ans+=max(0ll,r[i]-l[i]-sum[i]+1);
	cout<<ans<<endl;
}
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
int main()
{
	IOS;
	cin>>n>>m;
	sq=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		l[i]=r[i-1]+1;
		r[i]=min(sq*i,n);
		for(int j=l[i];j<=r[i];j++)
			b[j]=i;
		if(l[i]>n)
		{
			gs=i;
			break;
		}
	}
	while(m--)
	{
		cin>>x>>y;
		if(x>y)
			swap(x,y);
		add(x,y);
		query();
	}
	QwQ;
}
2023/11/17 20:56
加载中...