首页 新闻 会员 周边 捐助

求助!!![TJOI2009] 开关样例过不了,如何解决?(语言-c++)

0
[待解决问题]

题目链接:https://www.luogu.com.cn/problem/P9869

我的输出:1  12

include<bits/stdc++.h>

using namespace std;
const int N=100300;
int n,m,c,a,b;
struct node
{
int f=0;
int sum,l,r;
//sum为开灯总数
}tr[N<<2];
void up(int k)
{
tr[k].sum+=tr[k2].sum+tr[k2+1].sum;
return;
}
void build(int k,int l,int r)
{
tr[k].l=l;
tr[k].r=r;//!
if(lr)
{
tr[k].sum=0;
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k2+1,mid+1,r);
}
void down(int k)
{
// cout<<"aa "<<k<<" "<<tr[k].l<<" "<<tr[k].r<<endl;
tr[k
2].sum=tr[k2].r-tr[k2].l+1-tr[k2].sum;
tr[k
2+1].sum=tr[k2+1].r-tr[k2+1].l+1-tr[k2+1].sum;
//因为整个k区间相反操作 就等于块长减去原来总数
if(tr[k<<1].f)
tr[k<<1].f=0;
else
tr[k<<1].f=1;
if(tr[k
2+1].f)
tr[k2+1].f=0;
else
tr[k
2+1].f=1;
tr[k].f=0;
return;//!
}
void change(int k,int l,int r)
{
int x=tr[k].l,y=tr[k].r;
//printf("%d %d %d\n",k,x,y);
if(y<=r && x>=l)
{
tr[k].sum=y-x+1-tr[k].sum;
if(tr[k].f)
tr[k].f=0;
else
tr[k].f=1;
return;
}
if(tr[k].f)
down(k);
int mid=(x+y)>>1;
if(a<=mid)
change(k<<1,l,r);//!
if(b>mid)
change(k2+1,l,r);
up(k);
}
int find(int k,int l,int r)
{
int x=tr[k].l,y=tr[k].r;
if(y<=r && x>=l)
return tr[k].sum;
if(tr[k].f)
down(k);
int ans=0;//在外面赋0
int mid=(x+y)>>1;
if(a<=mid)
ans+=find(k<<1,l,r);//!
if(b>mid)
ans+=find(k
2+1,l,r);
return ans;
}
int main()
{
cin>>n>>m;
build(1,1,n);
while(m--)
{
cin>>c>>a>>b;
if(c
0)
change(1,a,b);
else
cout<<find(1,a,b)<<"\n";
}
return 0;
}

suill的主页 suill | 菜鸟二级 | 园豆:204
提问于:2024-07-14 21:18
< >
分享
所有回答(1)
0

include<bits/stdc++.h>

using namespace std;
const int N=100300;
int n,m,c,a,b;
struct node {
int f=0;
int sum,l,r;
} tr[N<<2];
void up(int k) {
tr[k].sum = tr[k2].sum + tr[k2+1].sum;
}
void build(int k,int l,int r) {
tr[k].l=l;
tr[k].r=r;
if(lr) {
tr[k].sum=0;
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k2+1,mid+1,r);
}
void down(int k) {
tr[k
2].f^=1;
tr[k2+1].f^=1;
tr[k
2].sum = tr[k2].r - tr[k2].l + 1 - tr[k2].sum;
tr[k
2+1].sum = tr[k2+1].r - tr[k2+1].l + 1 - tr[k2+1].sum;
tr[k].f=0;
}
void change(int k,int l,int r) {
int x=tr[k].l,y=tr[k].r;
if(y<=r && x>=l) {
tr[k].sum = y-x+1 - tr[k].sum;
tr[k].f^=1;
return;
}
if(tr[k].f) down(k);
int mid=(x+y)>>1;
if(l<=mid) change(k<<1,l,r);
if(r>mid) change(k
2+1,l,r);
up(k);
}
int find(int k,int l,int r) {
int x=tr[k].l,y=tr[k].r;
if(y<=r && x>=l) return tr[k].sum;
if(tr[k].f) down(k);
int ans=0;
int mid=(x+y)>>1;
if(l<=mid) ans+=find(k<<1,l,r);
if(r>mid) ans+=find(k*2+1,l,r);
return ans;
}
int main() {
cin>>n>>m;
build(1,1,n);
while(m--) {
cin>>c>>a>>b;
if(c
0)
change(1,a,b);
else
cout<<find(1,a,b)<<"\n";
}
return 0;
}

suill | 园豆:204 (菜鸟二级) | 2024-07-14 21:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册