社区讨论

分块WA10pts求调

P3870[TJOI2009] 开关参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo10py5d
此快照首次捕获于
2023/10/22 13:18
2 年前
此快照最后确认于
2023/11/02 12:47
2 年前
查看原帖
写吐了,大佬帮忙造一组hack数据也行
CPP
#include <bits/stdc++.h>
using namespace std;
int n,m,opt,L,R;
const int N=1e5+10;
bool a[N],yh[N];
int fk[N],ans[N],len,ret;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>n>>m;
	len=sqrt(n);
	for(int i=1;i<=n;i++)
		fk[i]=ceil(1.0*i/len);
	while(m--)
	{
		cin>>opt>>L>>R;
		if(opt==0)
		{
			if(fk[L]==fk[R])
			{
				for(int i=L;i<=R;i++)
				{
					a[i]=!a[i];
					if(a[i])	ans[fk[L]]++;
					else	ans[fk[L]]--;
				}
			}
			else
			{
				for(int i=L;fk[i]==fk[L];i++)
				{
					a[i]=!a[i];
					if(a[i])	ans[fk[L]]++;
					else	ans[fk[L]]--;
				}

				for(int i=fk[L]+1;i<fk[R];i++)
					ans[i]=len-ans[i],yh[i]=!yh[i];

				for(int i=R;fk[i]==fk[R];i--)
				{
					a[i]=!a[i];
					if(a[i])	ans[fk[R]]++;
					else	ans[fk[R]]--;
				}
			}
		}
		else
		{
			ret=0;
			if(fk[L]==fk[R])
			{
				for(int i=L;i<=R;i++)
					ret+=a[i]^yh[fk[L]];
			}
			else
			{
				for(int i=L;fk[i]==fk[L];i++)
					ret+=(int)(a[i]^yh[fk[L]]);
				for(int i=fk[L]+1;i<fk[R];i++)
					ret+=ans[i];
				for(int i=R;fk[i]==fk[R];i--)
					ret+=(int)(a[i]^yh[fk[R]]);
			}
			cout<<ret<<'\n';
		}
	}
	return 0;
	
}


验证码kgnb

回复

4 条回复,欢迎继续交流。

正在加载回复...