100pts Unaccepted求调
查看原帖
100pts Unaccepted求调
767660
zhaohanwen楼主2023/11/11 08:13

rt.

想用分块AC的,结果hack数据TLE了,是这道题卡分块还是我写的复杂度不对。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+5;
int n,len,q;
ll block[N],id[N],a[N],tag[N];
int calc(int x)
{
	if(x==0) return 1;
	else if(x==1) return 0;
}
void build()
{
	len=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		id[i]=(i-1)/len+1;
		block[id[i]]+=a[i];
	}
}
void change(int l,int r)
{
	int p1=id[l],p2=id[r];
	if(p1==p2)
	{
		for(int i=l;i<=r;i++)
		{
			a[i]=calc(a[i]);
			block[p1]=len-(r-l+1);
		}
		return;
	}
	for(int i=l;i<=p1*len;i++)
	{
		a[i]=calc(a[i]);
		block[p1]=len-(p1*len-l+1);
	}
	for(int i=(p2-1)*len+1;i<=min(r,n);i++)
	{
		a[i]=calc(a[i]);
		block[p2]=len-(min(r,n)-((p2-1)*len+1)+1);
	}
	for(int i=p1+1;i<=p2-1;i++)
	{
		block[i]=len-block[i];
		tag[i]=calc(tag[i]);
	}
}
void pushdown(int k)
{
	if(tag[k])
	{
		for(int i=(k-1)*len+1;i<=k*len;i++)
		{
			a[i]=calc(a[i]);
		}
		tag[k]=0;
	}
	return ;
}
ll query(int l,int r)
{
	int p1=id[l],p2=id[r];
	pushdown(p1);
	pushdown(p2);
	ll ans=0;
	if(p1==p2)
	{
		for(int i=l;i<=r;i++)
		{
			ans+=a[i];
		}
		return ans;
	}
	for(int i=l;i<=p1*len;i++)
	{
		ans+=a[i];
	}
	for(int i=(p2-1)*len+1;i<=min(r,n);i++)
	{
		ans+=a[i];
	}
	for(int i=p1+1;i<=p2-1;i++)
	{
		ans+=block[i];
	}
	return ans;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>q;
	while(q--)
	{
		int op,l,r;
		cin>>op>>l>>r;
		if(op==0) change(l,r);
		else cout<<query(l,r)<<'\n';		
	}
	return 0;
}

记录

2023/11/11 08:13
加载中...