社区讨论

分块0pts求条(关

P3870[TJOI2009] 开关参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mm1pgcgb
此快照首次捕获于
2026/02/25 15:20
2 周前
此快照最后确认于
2026/02/26 21:15
上周
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int m,n,bl,t;
bool lt[500001],add[800];
int head[800],tail[800];
int sum[800];
int cnt[500001];
int main(){
    cin>>n>>m;
    bl=sqrt(n);
    t=n/bl;
    if(n%bl)t++;
    for(int i=1;i<=t;++i){
        head[i]=(i-1)*bl+1;
        tail[i]=i*bl;
    }
    tail[t]=n;
    for(int i=1;i<=n;++i){
        cnt[i]=(i-1)/bl;
    }
//    cout<<endl;
    while(m--){
        int a,b,c;
        cin>>a>>b>>c;
        if(a==0)
            if(cnt[b]==cnt[c])
                for(int i=b;i<=c;++i){
                    lt[i]=!lt[i];
                    if(lt[i])sum[cnt[i]]++;
                    else sum[cnt[i]]--;
                }
            else{
                for(int i=cnt[b]+1;i<cnt[c];++i)
                    add[i]=!add[i];
                for(int i=b;i<=tail[cnt[b]];++i){
                    lt[i]=!lt[i];
                    if(lt[i])sum[cnt[i]]++;
                    else sum[cnt[i]]--;
                }
                for(int i=head[cnt[c]];i<=c;++i){
                    lt[i]=!lt[i];
                    if(lt[i])sum[cnt[i]]++;
                    else sum[cnt[i]]--;
                }
            }
        else{
            int ans=0;
            if(cnt[b]==cnt[c])
         	   for(int i=b;i<=c;++i)
                    if(lt[i]==add[cnt[i]])
                    ans++;
       	   	else{
             	for(int i=cnt[b]+1;i<cnt[c];++i)
             		if(add[i])
                        ans+=bl-sum[i];
                    else 
                        ans+=sum[i];
             	for(int i=b;i<=tail[cnt[b]];++i)
                    if(lt[i]==add[cnt[i]])
                        ans++;
        		for(int i=head[cnt[c]];i<=c;++i)
                    if(lt[i]==add[cnt[i]])
                        ans++;
   		    }
            cout<<ans<<'\n';
        }
  /*      for(int i=1;i<=n;++i){
        	cout<<lt[i]<<' ';
		}
		cout<<endl;*/
    }
    return 0;
}

回复

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

正在加载回复...