关于线段树的建树
  • 板块学术版
  • 楼主Jordan_Pan
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/12/25 15:45
  • 上次更新2024/12/25 20:52:39
查看原帖
关于线段树的建树
1002571
Jordan_Pan楼主2024/12/25 15:45

写了一个区间颜色段数量的线段树板子题,我的代码是这样的:

#include<cstdio>
constexpr int rSiz=1<<21;
char rBuf[rSiz],*p1=rBuf,*p2=rBuf;
#define gc() (p1==p2&&(p2=(p1=rBuf)+fread(rBuf,1,rSiz,stdin),p1==p2)?EOF:*p1++)
template<class T>void rd(T&x){
	char ch=gc();
	for(;ch<'0'||ch>'9';ch=gc());
	for(x=0;ch>='0'&&ch<='9';ch=gc())
		x=(x<<1)+(x<<3)+(ch^48);
}
#include<vector>
constexpr int _=1e5+5;
int n,m,a[_];
#define mid ((l+r)>>1)
struct node{int sum,lc,rc,tag;}t[_<<2];
void Add(int x,int v){
	t[x].sum=0;t[x].lc=t[x].rc=t[x].tag=v;
}
node Pup(node x,node y){
	if(!x.lc)return y;
	if(!y.lc)return x;
	node p;p.lc=x.lc;p.rc=y.rc;
	if(!x.sum&&x.lc==x.rc){
		if(!y.sum&&y.lc==y.rc)p.sum=0;
		else p.sum=y.sum+(x.rc!=y.lc);
	}
	else if(!y.sum&&y.lc==y.rc)
		p.sum=x.sum+(x.rc!=y.lc);
	else p.sum=x.sum+y.sum+1+(x.rc!=y.lc);
	return p;
}
void Pdn(int x){
	if(!t[x].tag)return;
	Add(x<<1,t[x].tag);Add(x<<1|1,t[x].tag);
	t[x].tag=0;
}
void Bld(int x,int l,int r){
	if(l==r)return Add(x,a[l]),void();
	Bld(x<<1,l,mid);Bld(x<<1|1,mid+1,r);
	t[x]=Pup(t[x<<1],t[x<<1|1]);
//	printf("");
}
void Chg(int x,int l,int r,int L,int R,int v){
	if(L<=l&&r<=R)return Add(x,v),void();
	Pdn(x);
	if(L<=mid)Chg(x<<1,l,mid,L,R,v);
	if(R>mid)Chg(x<<1|1,mid+1,r,L,R,v);
	t[x]=Pup(t[x<<1],t[x<<1|1]);
}
node Qry(int x,int l,int r,int L,int R){
	if(L<=l&&r<=R)return t[x];
	Pdn(x);
	if(R<=mid)return Qry(x<<1,l,mid,L,R);
	else if(L>mid)return Qry(x<<1|1,mid+1,r,L,R);
	else return Pup(Qry(x<<1,l,mid,L,R),Qry(x<<1|1,mid+1,r,L,R));
}
int Qry(int l,int r){
	node p=Qry(1,1,n,l,r);
	if(!p.sum)return 1+(p.lc!=p.rc);
	return p.sum+2;
}
int main(){
	rd(n),rd(m);
	for(int i=1;i<=n;i++)rd(a[i]);
	Bld(1,1,n);
	for(int i=1,x,y;i<=m;i++){
		rd(x),rd(y);
		printf("%d\n",Qry(x,y));
	}
}

然后它过了.但是对于这组数据:

6 1
2 2 2 1 1 1
1 4

答案显然是 2,但是它在本地和洛谷 IDE 上输出了 1.

可以看到我注释了一行 printf("");,因为如果加上这句,本地运行就是对的.

所以为什么呢 qwq.还有为什么在这里(发布帖子的界面)不能打出中文标点?

2024/12/25 15:45
加载中...