写了一个区间颜色段数量的线段树板子题,我的代码是这样的:
#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.还有为什么在这里(发布帖子的界面)不能打出中文标点?