蒟蒻TLE求助!!!
查看原帖
蒟蒻TLE求助!!!
362627
frank15楼主2021/2/4 22:53
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=350;
int n,t,tot,op,L,R,start,end,num;
int a[maxn*maxn];
struct blo{
	int l,r,sum,tag;
}block[350];
void update(int l,int r){
	start=l/tot+l%tot?1:0;
	end=r/tot+r%tot?1:0;
	if(start==end){
		for(int i=l;i<=r;i++){	
			if(a[i])
				block[start].sum--;	
			else
				block[start].sum++;
			a[i]=!a[i];
		}
		return ;
	}
	if(l!=block[start].l){
		for(int i=l;i<=block[start].r;i++){	
			if(a[i])
				block[start].sum--;	
			else
				block[start].sum++;
			a[i]=!a[i];
		}
		start++;		
	}
	if(r!=block[end].r){
		for(int i=block[end].l;i<=r;i++){	
			if(a[i])
				block[end].sum--;	
			else
				block[end].sum++;
			a[i]=!a[i];
		}
		end--;
	}
	for(int i=start;i<=end;i++){
		block[i].sum=tot-block[i].sum;
		block[i].tag=!block[i].tag;
	}
	return ;
}
int query(int l,int r){
	num=0;
	start=l/tot+l%tot?1:0;
	end=r/tot+r%tot?1:0;
	if(start==end){
		if(block[start].tag){
			for(int i=l;i<=r;i++){	
				if(!a[i])
					num++;
			}
			return num;
		}
		else{
			for(int i=l;i<=r;i++){	
				if(a[i])
					num++;
			}
			return num;
		}
	}
	if(l!=block[start].l){
		if(block[start].tag)
			for(int i=l;i<=block[start].r;i++)
				if(!a[i])
					num++;
		else
			for(int i=l;i<=block[start].r;i++)
				if(a[i])
					num++;
		start++;				
	}			
	if(r!=block[end].r){
		if(block[end].tag)
			for(int i=block[end].l;i<=r;i++)
				if(!a[i])
					num++;
		else
			for(int i=block[end].l;i<=r;i++)
				if(a[i])
					num++;	
		end--;
	}
	for(int i=start;i<=end;i++)
			num+=block[i].sum;
	return num;
}
int main(){
	scanf("%d%d",&n,&t);
	tot=sqrt(n);
	for(int i=1;i<=tot;i++){
		block[i].l=i+tot*(i-1);
		block[i].r=tot*i;
	}
	if(block[tot].r<n){
		block[tot+1].l=block[tot].r+1;
		block[tot+1].r=n;	
	}
	while(t--){
		scanf("%d%d%d",&op,&L,&R);
		if(!op)
			update(L,R);
		else
			printf("%d\n",query(L,R));
	}
	return 0;
}

莫名的都tle了,就对了两个点

2021/2/4 22:53
加载中...