ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P3870 [TJOI2009]开关 题解

2020-10-27 10:02:14  阅读:206  来源: 互联网

标签:ch int 题解 pos ret maxn P3870 TJOI2009 getchar


Link

P3870 [TJOI2009]开关

Solve

把序列分成\(\sqrt{N}\)个块,每个块整体处理时亮着的灯数=块内灯总数-前一时刻亮着的灯数,块外的单独处理就好了。

貌似线段树也是这种统计方式

Code

#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int N,Q,a[maxn],L[maxn],pos[maxn],R[maxn],add[maxn],sum[maxn],t,light[maxn];
inline int read(){
	int ret=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
	while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
	return ret*f;
}
void change(int l,int r){
	int p=pos[l],q=pos[r];
	if(p==q){
		for(int i=l;i<=r;i++){
			a[i]^=1;
			if(a[i]^add[p])light[p]++;
			else light[p]--;
		}
	}
	else {
		for(int i=p+1;i<=q-1;i++){add[i]^=1;light[i]=sum[i]-light[i];}
		for(int i=l;i<=R[p];i++){
			a[i]^=1;
			if(a[i]^add[p])light[p]++;
			else light[p]--;
		}
		for(int i=L[q];i<=r;i++){
			a[i]^=1;
			if(a[i]^add[q])light[q]++;
			else light[q]--;
		}
	}
	return ;
}
int query(int l,int r){
	int ans=0,p=pos[l],q=pos[r];
	if(p==q){
		for(int i=l;i<=r;i++)ans+=a[i]^add[p];
	}
	else{
		for(int i=p+1;i<=q-1;i++)ans+=light[i];
		for(int i=l;i<=R[p];i++)ans+=a[i]^add[p];
		for(int i=L[q];i<=r;i++)ans+=a[i]^add[q];
	}
	return ans;
}
int main(){
	freopen("P3870.in","r",stdin);
	freopen("P3870.out","w",stdout);
	N=read();Q=read();
	t=sqrt(N);
	for(int i=1;i<=t;i++){
		L[i]=(i-1)*t+1;
		R[i]=i*t;
	}
	if(R[t]<N){t++;L[t]=R[t-1]+1;R[t]=N;}
	for(int i=1;i<=t;i++)
	for(int j=L[i];j<=R[i];j++){
		pos[j]=i;
		sum[i]++;
	}
	while(Q--){
		int op=read(),l=read(),r=read();
		if(!op)change(l,r);
		else printf("%d\n",query(l,r));
	}
	return 0;
}

标签:ch,int,题解,pos,ret,maxn,P3870,TJOI2009,getchar
来源: https://www.cnblogs.com/martian148/p/13883283.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有