社区讨论

关于一对一错的灵异事件

P3870[TJOI2009] 开关参与者 2已保存回复 7

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@mm24u061
此快照首次捕获于
2026/02/25 22:31
上周
此快照最后确认于
2026/02/27 11:55
上周
查看原帖

0pts代码

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+1;
    }
    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';
        }
    }
    return 0;
}

100pts代码

CPP
#include <bits/stdc++.h>
using namespace std;
int n, m, 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 + 1;
    }
    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 res = 0;
            if (cnt[b] == cnt[c]) {
                for (int i = b; i <= c; ++i)
                    if (lt[i] ^ add[cnt[i]]) res++;
            } else {
                for (int i = cnt[b] + 1; i < cnt[c]; ++i)
                    if (add[i])
						res+=bl-sum[i];
					else res += sum[i];
                for (int i = b; i <= tail[cnt[b]]; ++i)
                    if (lt[i] ^ add[cnt[i]]) res++;
                for (int i = head[cnt[c]]; i <= c; ++i)
                    if (lt[i] ^ add[cnt[i]]) res++;
            }
            cout << res << "\n";
        }
    }
    return 0;
}
本蒟蒻对此感到不解,求dalao们解答🙏🏻🙏🏻🙏🏻

回复

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

正在加载回复...