社区讨论
动态开点线段树RE on 18求助
CF915EPhysical Education Lessons参与者 4已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lo95cktf
- 此快照首次捕获于
- 2023/10/28 05:50 2 年前
- 此快照最后确认于
- 2023/10/28 05:50 2 年前
是我的写法太菜了吗
CPP#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,q;
struct Segment_Tree
{
int ls[8000005],rs[8000005];
int l[8000005],r[8000005];
int tot,w[8000005],lzy[8000005];
int build(int ll,int rr)
{
tot++;
l[tot]=ll;r[tot]=rr;
w[tot]=0;lzy[tot]=-1;
ls[tot]=rs[tot]=0;
return tot;
}
void down(int k)
{
int mid=(l[k]+r[k])/2;
if(ls[k]==0) ls[k]=build(l[k],mid);
if(rs[k]==0) rs[k]=build(mid+1,r[k]);
if(lzy[k]==-1) return ;
w[ls[k]]=lzy[k]*(mid-l[k]+1);
w[rs[k]]=lzy[k]*(r[k]-mid);
lzy[ls[k]]=lzy[rs[k]]=lzy[k];
lzy[k]=-1;
return ;
}
void change(int ll,int rr,int val,int k)
{
if(ll<=l[k]&&r[k]<=rr)
{
w[k]=val*(r[k]-l[k]+1);
lzy[k]=val;
return ;
}
down(k);
int mid=(l[k]+r[k])/2;
if(ll<=mid) change(ll,rr,val,ls[k]);
if(mid<rr) change(ll,rr,val,rs[k]);
w[k]=w[ls[k]]+w[rs[k]];
return ;
}
int query(){return w[1];}
}tr;
int main()
{
scanf("%d%d",&n,&q);
tr.build(1,n);
for(int i=1;i<=q;i++)
{
int ll,rr,val;
scanf("%d%d%d",&ll,&rr,&val);
val%=2;
tr.change(ll,rr,val,1);
printf("%d\n",n-tr.query());
}
return 0;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...