救救这个孩子吧!
查看原帖
救救这个孩子吧!
936616
zibenlun楼主2023/12/18 22:28

全 WA

#include<bits/stdc++.h>
using namespace std;
inline long long read() {
	long long s=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') {
		s=(s<<3)+(s<<1)+(ch^48);
		ch=getchar();
	}
	return s;
}
inline void write(long long x) {
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
struct nd{
	int l,r,pos=0,sum=0;
}c[100005];
int a[200005];
int len;
int n,m;
int cnt;
void build(){
	int l=1,r=len;
	while(l<=n){
		if(r>=n){
			c[++cnt].l=l;
			c[cnt].r=n;
			break;
		}
		c[++cnt].l=l;
		c[cnt].r=r;
		l+=len;
		r+=len;
	}
}
int s;
void find(int pos){
//	int l=0,r=cnt;
//	s=cnt;
//	while(l<r){
//		int mid=(l+r)/2;
//		if(c[mid].l<=pos){
//			s=max(s,mid);
//			r=mid-1;
//		}
//		else {
//			l=mid+1;
//		}
//	}
//	int ss=-0x3f3f3f3f;
//	for(int i=max(1,s-10);i<=min(cnt,s+10);i++){
//		if(c[i].l<=pos) ss=max(ss,i);
//		else break;
//	}
//	s=ss;
	for(int i=1;i<=cnt;i++){
		if(c[i].r>=pos){
			s=i;
			return ;
		}
	}
}
void add(int l,int r){
	find(l);
	int ans=0;
	if(c[s].l<l&&s<=cnt&&s>=1){
		for(int i=l;i<=min(c[s].r,r);i++){
			a[i]++;
			if(a[i]%2==1){
				c[s].sum++;
			}
			else {
				c[s].sum--;
			}
		}
		s++;
	}
	while(c[s].r<=r&&s<=cnt&&s>=1){
		c[s].pos++;
		c[s].sum=(c[s].r-c[s].l+1)-c[s].sum;
		s++;
	}
	if(c[s].l<=r&&s<=cnt&&s>=1){
		for(int i=c[s].l;i<=r;i++){
			a[i]++;
			if(a[i]%2==1){
				c[s].sum++;
			}
			else {
				c[s].sum--;
			}
		}
	}
}
int check(int l,int r){
	find(l);
	int ans=0;
	if(c[s].l<l&&s<=cnt&&s>=1){
		for(int i=l;i<=min(r,c[s].r);i++){
			if((c[s].pos+a[i])%2==1) ans++;
		}
		s++;
	}
	while(c[s].r<=r&&s<=cnt&&s>=1){
		ans+=c[s].sum;
		s++;
	}
	if(c[s].l<=r&&s<=cnt&&s>=1){
		for(int i=c[s].l;i<=r;i++){
			if((c[s].pos+a[i])%2==1) ans++;
		}
	}
	return ans;
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	len=sqrt(n);
	build();
	c[cnt+1].r=0x3f3f3f3f;
	c[cnt+1].l=0x3f3f3f3f;
	c[0].l=-0x3f3f3f3f;
	c[0].r=-0x3f3f3f3f;
	for(int i=1;i<=m;i++){
		int op,l,r;
		cin>>op>>l>>r;
		if(op==0){
			add(l,r);
		}
		else {
			cout<<check(l,r)<<"\n";
		}
	}
	return 0;
}
2023/12/18 22:28
加载中...