社区讨论
关于一对一错的灵异事件
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 条回复,欢迎继续交流。
正在加载回复...